【问题标题】:How to SELECT one column and yield two different columns based on distinct WHERE如何根据不同的 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 我忘了删除我的示例中被证明与解决我的问题无关的部分

标签: sql postgresql


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-11
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 2017-01-26
      相关资源
      最近更新 更多