我是SQL的新手(在这种情况下为 PostgreSQL ),无法弄清楚如何对同一行应用两个不同的条件以返回两个不同的行。我想可能是因为我无法说出我要做什么,所以我找不到答案。
示例:鉴于此数据,
桌布
user_id | clothes | is_blue
---------------------------
1 | skirt | t
2 | t-shirt | f
3 | socks | t
我希望能够选择:
1 /每个用户穿着蓝色且不同的服装的计数
SELECT
user_id,
COUNT(DISTINCT clothes) AS nb_blue_clothes
FROM table_clothes
WHERE is_blue
GROUP_BY user_id;
2 /人类所穿不同衣服的数量
SELECT
user_id,
COUNT(DISTINCT clothes) AS nb_clothes
FROM table_clothes
GROUP_BY user_id;
有没有一种方法可以将这两个SELECT合并到一个查询中,从而产生如下结果:
user_id | nb_blue_clothes | nb_clothes
--------------------------------------
1 | 45 | 67
2 | 4 | 48
3 | 89 | 103
您知道我应该了解什么才能解决此问题吗?
感谢您的帮助!
答案 0 :(得分:2)
您可以在下面尝试-使用条件聚合
SELECT
user_id,
COUNT(DISTINCT case when is_blue then clothes end) AS nb_blue_clothes,
COUNT(DISTINCT clothes) as nb_clothes
FROM table_clothes
GROUP_BY user_id
答案 1 :(得分:2)
在计数之前,您需要以某种方式应用条件。您可以使用显式的case
表达式(如@ fa06建议的那样),也可以让PostgreSQL为您做繁重的工作,并使用filter
子句:
SELECT user_id,
COUNT(DISTINCT clothes) FILTER (WHERE is_blue) AS nb_blue_clothes,
COUNT(DISTINCT clothes) AS nb_clothes
FROM table_clothes
GROUP BY user_id