【问题标题】:SQL How to use Count and Group By WXY and ZSQL 如何使用 WXY 和 Z 计数和分组
【发布时间】:2013-10-04 22:21:44
【问题描述】:

假设我正在尝试计算 W、X、Y 和 Z 中的元素数量。我不关心 WXY 中的具体数字,我只关心 Z。有什么办法可以使像这样:

column | count
---------------
 WXY   |  10
  Z    |  5

而不是

column | count
---------------
  W    |  2
  X    |  3
  Y    |  5
  Z    |  5

【问题讨论】:

  • 请使用 Ctrl+K,而不是一堆  <br> 标记进行代码格式化。
  • 这被标记为 sql-server 和 postgresql。您使用的是哪个数据库版本?如果您需要针对这两个版本的解决方案,那么您是否需要相同的查询来处理两个版本,或者是否需要为每个版本单独查询?

标签: sql sql-server postgresql count group-by


【解决方案1】:
SELECT [column] = CASE 
  WHEN [column] IN ('W','X','Y') THEN 'WXY' ELSE 'Z' END,
  [count] = COUNT(*)
FROM dbo.[table]
WHERE [column] IN ('W','X','Y','Z')
  GROUP BY CASE 
  WHEN [column] IN ('W','X','Y') THEN 'WXY' ELSE 'Z' END
ORDER BY [column];

【讨论】:

    【解决方案2】:

    SQL Fiddle

    select case 
        when c in ('W', 'X', 'Y') then 'XYZ'
        else 'Z' end as c,
        count(*)
    from t
    group by 1
    

    【讨论】:

    • 这将适用于 PostGreSQL,但不适用于 SQL Server。这个问题同时被标记了,所以不清楚 OP 需要什么。
    【解决方案3】:

    您可以使用公用表表达式 (CTE) 轻松完成此操作,并在尝试获取记录计数之前聚合数据。

    它适用于 PostgreSQL 和 SQL Server(但如果将列命名为“列”,则会出现问题)。

    PostgreSQL:SQL Fiddle SQL Server:SQL Fiddle

    ;with aggData as
    (
       select case 
                 when c = 'Z' then 'Z'
                 else 'WXY' 
              end as col
       from t
    )
    select col, count(*)
    from aggData
    group by col
    

    这里是有关使用 CTEs with SQL ServerCTEs with PostGreSQL 的文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 2013-07-19
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      相关资源
      最近更新 更多