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

Posted

技术标签:

【中文标题】如何根据不同的 WHERE 选择一列并生成两个不同的列【英文标题】:How to SELECT one column and yield two different columns based on distinct WHERE 【发布时间】:2019-01-30 07:29:25 【问题描述】:

我是 SQL 新手(在这种情况下为 PostgreSQL),无法弄清楚如何将两个不同的条件应用于同一行以返回两个不同的行。这可能是因为我无法说出我正在尝试做的事情,我想我找不到答案......

一个例子:给定这个数据,

table_clothes

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

知道我应该学习什么来解决这个问题吗?

感谢您的帮助!

【问题讨论】:

我有点恼火:1是兽人,不是人类。为什么要计数? 谢谢@S-Man 我忘了删除我的示例中被证明与解决我的问题无关的部分 【参考方案1】:

您需要在计数之前以某种方式应用条件。您可以使用明确的 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

【讨论】:

【参考方案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

【讨论】:

以上是关于如何根据不同的 WHERE 选择一列并生成两个不同的列的主要内容,如果未能解决你的问题,请参考以下文章

如何选择列并为不存在的列生成 Nan 值?

按标题选择一列并使用宏 ROUND 到最近的一分钱

比较两个列并从同一个表中的另一列获取数据

熊猫合并具有不同名称的列并避免重复[重复]

如何根据表格第一列拆分出不同的sheet?

根据两个不同的条件拆分一列字符串(具有不同的模式)