通过转置和计数各个行条目来对 SQL 表进行排序?

问题描述 投票:0回答:1

我目前正试图通过尝试按每个条目的计数对以下示例表(我从我的帽子顶部拉出的随机示例,所以没有任何意义)进行排序,来复习我非常有限的 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 group-by count sql-order-by transpose
1个回答
0
投票

您可以使用动态 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;
© www.soinside.com 2019 - 2024. All rights reserved.