2012-02-08 34 views
1

我有一个select语句返回给我5列(并且需要1-2分钟) 其中一列是颜色(即只有三种颜色红色,蓝色和黄色)。现在我想在同一个选择语句中显示具有红色的行数,具有蓝色的行数和具有黄色的行数。在相同的select语句中的聚合查询

Select语句是这个

enter image description here

,我想这样的

enter image description here

任何帮助输出?

+0

1-2分钟?它使用了多少个表和行?如果您将SQL语句添加到您的文章中,这将帮助我们帮助您。 – 2012-02-08 18:36:18

回答

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 
+1

您可以将SUM()更改为COUNT()或将该情况更改为:......然后1 ELSE 0 END – 2012-02-08 18:46:06

+0

这有可怕的性能。这将执行4倍的速度。 – usr 2012-02-08 18:47:25

+1

@ypercube我加了'ELSE'。 @usr我更专注于问题 – Lamak 2012-02-08 18:51:11

1

使用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 
+0

是啊!我也做过同样的事情,并对拉马克邮报发表评论。但是,谢谢。 +1提到..我相信别人也会从这个查询中学到 – Zerotoinfinity 2012-02-08 18:57:35

+0

我以前错过了2行。现在更正:) – 2012-02-08 19:18:07