SQL Group By以获取列值的计数

Posted

技术标签:

【中文标题】SQL Group By以获取列值的计数【英文标题】:SQL GroupBy to get count of column value 【发布时间】:2020-07-17 13:22:47 【问题描述】:

我有下表Rates 的数据如下:

Code  Value
 A     FC
 B     PC
 A     PC
 A     FC
 B     FC
 C     PC

我期望输出如下:

Code  FC  PC
 A    2    1
 B    1    1
 C    0    1

我写的查询如下:

SELECT
  Rates.Code AS Code,
  SUM(CASE WHEN Rates.Value='FC' THEN 1 ELSE 0 END) AS FC,
  SUM(CASE WHEN Rates.Value='PC' THEN 1 ELSE 0 END) AS PC
FROM
 Rates
GROUP BY Rates.Code
ORDER BY Rates.Code

它没有以预期的格式给出输出,我想我需要使用 Pivot 但不知道如何编写它,因为我是 SQL 新手。 我已经编写了如下 python 代码,这对我来说很好,如果有人知道如何编写 SQL,这将非常有帮助。

Rates.groupby(['Code'])['Value'].value_counts().unstack(fill_value=0)`

【问题讨论】:

它给你的输出是什么? 您的查询在我的测试中有效。你得到了什么? @Rajat 我只得到 FC 和 PC 的 1 和 0 值。 @PiyushS.Wanare 会不会是值字段中隐藏了一些特殊字符?尝试在 case 表达式中使用 like '%FC%' 看看是否是问题所在。 @Rajat ,在这种情况下我需要使用like 而不是= 【参考方案1】:

查询对我来说看起来不错,但如果“值”列中有 NULL 值,您可能会遇到问题。在这种情况下,您可以使用“coalesce”包裹该列,如下所示:

SELECT
  Rates.Code AS Code,
  SUM(CASE WHEN coalesce(Value, '')='FC' THEN 1 ELSE 0 END) AS FC,
  SUM(CASE WHEN coalesce(Value, '')='PC' THEN 1 ELSE 0 END) AS PC
FROM
 Rates
GROUP BY Rates.Code
ORDER BY Rates.Code

好吧,假设这是您的问题。如果您添加预期的输出和您在问题中得到的输出,这会有所帮助。

【讨论】:

不,我没有 NULL 值,因为我已经在 FC 和 PC 的基础上过滤数据,额外的列会产生问题吗?因为此表还包含 10 列。

以上是关于SQL Group By以获取列值的计数的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 中检索没有 group by 语句的列值

如何在不使用 GROUP BY 子句的情况下获取列值

pandas取列值转化为列表

sql:选择由另一列分组的两列值的计数并获得两个计数的比率

GROUP BY 并将列值放入单行列

如何将GROUP BY与AGGREGATED列值一起使用