【问题标题】:Aggregate query in same select statement在同一选择语句中聚合查询
【发布时间】:2012-02-08 18:34:06
【问题描述】:

我有一个 select 语句,它返回 5 列(这需要 1-2 分钟) 其中一列是颜色(即只有红色、蓝色和黄色三种颜色)。现在我想在同一个 select 语句中显示红色的行数、蓝色的行数和黄色的行数。

选择语句是这样的

我想要这样的输出

有什么帮助吗?

【问题讨论】:

  • 1-2 分钟?它在多少个表和行上运行?如果您将 SQL 语句添加到您的帖子中,这将有助于我们为您提供帮助。

标签: sql-server aggregates


【解决方案1】:

你想要这个(对于 SQL Server 2005+):

SELECT  *, SUM(CASE WHEN Color = 'RED' THEN 1 ELSE 0 END) OVER() [RED],
        SUM(CASE WHEN Color = 'BLUE' THEN 1 ELSE 0 END) OVER() [BLUE],
        SUM(CASE WHEN Color = 'Yellow' THEN 1 ELSE 0 END) OVER() [Yellow]
FROM YourTable

【讨论】:

  • 您可以将 SUM() 更改为 COUNT() 或将案例更改为:... THEN 1 ELSE 0 END
  • 这性能很差。这将执行慢 4 倍。
  • @ypercube 我添加了ELSE。 @usr 我更专注于问题的单选部分
  • @lamak 感谢您的回答。 :-) 对此,我真的非常感激。你刚刚拯救了我的一天!
  • @ypercube +1 提出建议。我已根据您的建议修改了查询。
【解决方案2】:

使用 CTE(通用表表达式):

; 
WITH cte AS
( SELECT ...
  ... your query here
) 
WITH grp AS
( SELECT 
        color
      , COUNT(*) AS cnt
  FROM
        cte
  GROUP BY
        color
) 
SELECT 
      cte.*
    , (SELECT cnt FROM grp WHERE color = 'Red')    AS Red
    , (SELECT cnt FROM grp WHERE color = 'Blue')   AS Blue
    , (SELECT cnt FROM grp WHERE color = 'Yellow') AS Yellow
FROM 
      cte

【讨论】:

  • 是的!我做了同样的事情并对 Lamak 帖子发表了评论。不过谢谢。 +1 提一下.. 我相信其他人也会从这个查询中学习
  • 我之前错过了 2 行。现在更正:)
猜你喜欢
  • 2020-10-04
  • 2021-05-22
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多