postgresql 如何检查在一行中重复的每个值的计数

h7appiyu  于 2022-12-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(142)

我有两张表,第一张表的数据是:

ID         Username
1           Dan
2           Eli
3           Sean
4           John

第二个表数据:

user_id           Status_id
    1                   2  
    1                   3
    4                   1
    3                   2
    2                   3
    1                   1
    3                   3
    3                   3
    3                   3
    .                   .
    goes on             goes on

这两张table都是我的。
我想找出单个用户执行“status_id”的频率
我的预期结果是:

username     status_id(1)   status_id(2)     status_id(3)
Dan                1             1                1
Eli                0             0                1
Sean               0             1                2
John               1             0                0


我的当前代码是:

SELECT b.username , COUNT(a.status_id)
FROM masterdb.auth_user b
left outer join masterdb.xmlform_joblist a
on a.user1_id = b.id 
GROUP BY b.username, b.id, a.status_id

这样就得到了单独的计数,但是在一行中,没有提到每列代表哪个status_id

zujrkrfu

zujrkrfu1#

这称为透视,分两步进行:

  • 使用CASE语句提取特定字段的数据
  • 聚合用户的数据,以使每个用户的每个字段值都位于同一记录中
SELECT Username, 
       SUM(CASE WHEN status_id = 1 THEN 1 END) AS status_id_1,
       SUM(CASE WHEN status_id = 2 THEN 1 END) AS status_id_2,
       SUM(CASE WHEN status_id = 3 THEN 1 END) AS status_id_3
FROM       t2
INNER JOIN t1 
        ON t2.user_id = t1._ID
GROUP BY Username
ORDER BY Username

检查here演示。
注:此解决方案假定有3个status_id值。如果需要概括状态id的数量,则需要动态查询。无论如何,最好尽量避免动态查询。

相关问题