如何选择一个列并根据不同的WHERE产生两个不同的列

时间:2019-01-30 07:29:26

标签: sql postgresql

我是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

您知道我应该了解什么才能解决此问题吗?

感谢您的帮助!

2 个答案:

答案 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