我目前正试图通过尝试按每个条目的计数对以下示例表(我从我的帽子顶部拉出的随机示例,所以没有任何意义)进行排序,来复习我非常有限的 SQL 技能。 ... 条目表示无限数量的行/列。目标是获得一个表格,自动将“已消化”和“已玩过”的每个条目转换为计数的行条目。
源表(名称TEST-TABLE):
动物 | 消化了 | 玩过 |
---|---|---|
狗 | 款待 | 假骨头 |
猫 | 湿粮 | 球 |
狗 | 款待 | 追松鼠 |
狗 | 土豆 | 球 |
狗 | 款待 | 球 |
... | ... | ... |
目标表:
动物 | 款待 | 湿粮 | 土豆 | 假骨 | 球 | 追松鼠 | ... |
---|---|---|---|---|---|---|---|
狗 | 3 | 0 | 1 | 1 | 3 | 1 | ... |
猫 | 0 | 1 | 0 | 0 | 1 | 0 | ... |
由于我基本上又从零开始,所以我取得的唯一进展如下:
SELECT Animal, Digested, COUNT(*), Played with, COUNT(*)
FROM TEST-TABLE
WHERE Animal IS NOT NULL
GROUP BY Animal, Digested, Played with
ORDER BY Animal
这显然不是解决方案,我感谢您的任何意见。目标表不一定必须与我上面输入的表相同,但是能够计算每只动物的每项活动的数据就太棒了!
您可以使用动态 SQL,使用 这个 SQLFiddle 示例:
WITH distinct_activities AS (
SELECT DISTINCT digested AS activity FROM TEST_TABLE
UNION
SELECT DISTINCT played_with AS activity FROM TEST_TABLE
),
-- Generate the dynamic pivot query using string_agg
pivot_query AS (
SELECT
'SELECT Animal, ' ||
string_agg(
'SUM(CASE WHEN digested = ''' || activity || ''' THEN 1 ELSE 0 END) AS ' || quote_ident(activity) ||
', SUM(CASE WHEN played_with = ''' || activity || ''' THEN 1 ELSE 0 END) AS ' || quote_ident(activity),
', '
) || '
FROM TEST_TABLE
GROUP BY animal' AS query
FROM distinct_activities
)
SELECT query FROM pivot_query;