2017-10-10 93 views
1
Code  Date  Result  
1   6/1/17   A  
1   6/3/17   A  
2   6/5/17   A  
2   6/7/17   B  
1   6/1/17   A  
1   6/3/17   B  
1   6/5/17   C  
2   6/7/17   C 

我需要编写挑选所有不同的代码,每个代码的所有实例的数量,然后根据结果每个代码的计数的查询。所以,最终的结果将是:计数基于几个其他的一个属性实例的属性

Code  Total Count  Count A  Count B  Count C 
1    5    3   1   1 
2    3    1   1   1  
+0

它只有A,B和C吗? –

+0

做一个“GROUP BY”。使用'case'表达式来进行条件聚合。 – jarlh

回答

0

这种查询可以为你工作:

SELECT 
code, 
COUNT(*) AS total_count, 
SUM(CASE result WHEN 'A' THEN 1 ELSE 0 END) AS count_a, 
SUM(CASE result WHEN 'B' THEN 1 ELSE 0 END) AS count_b, 
SUM(CASE result WHEN 'C' THEN 1 ELSE 0 END) AS count_c 
FROM yourtable 
GROUP BY code 
ORDER BY code; 

是否有A,B和C的唯一的结果值?如果是这样,那么这将是好的。如果有更多的价值,那么写10或20或100个案例陈述将是混乱的,并且会有另一种方式来做到这一点。

0

如果Result已知,则可以使用上面的bbrumm的答案。但是,如果有更多的Result,您可以使用动态交叉分析:

CREATE TABLE Tbl(Code INT, Date Date, Result VARCHAR(10)); 

INSERT INTO Tbl VALUES 
(1, '06/01/2017', 'A'), 
(1, '06/03/2017', 'A'), 
(2, '06/05/2017', 'A'), 
(2, '06/07/2017', 'B'), 
(1, '06/01/2017', 'A'), 
(1, '06/03/2017', 'B'), 
(1, '06/05/2017', 'C'), 
(2, '06/07/2017', 'C'); 

DECLARE @sql NVARCHAR(MAX) = N''; 

SELECT @sql = 
'SELECT 
    code 
    , COUNT(Result) AS TotalCount' + CHAR(10); 

SELECT @sql = @sql + 
' , SUM(CASE WHEN Result = ''' + Result + ''' THEN 1 ELSE 0 END) AS ' + QUOTENAME('Count' + Result) + CHAR(10) 
FROM (SELECT DISTINCT Result FROM Tbl) t; 

SELECT @sql = @sql + 
'FROM Tbl 
GROUP BY Code 
ORDER BY Code'; 

PRINT(@sql); 
EXEC sp_executesql @sql; 

DROP TABLE Tbl; 

ONLINE DEMO

0

你可以简单PIVOT像下面

select 
    Code, 
    [Total Count]=ISNULL(A,0)+ISNULL(B,0)+ISNULL(C,0), 
    [Count A]=ISNULL(A,0), 
    [Count B]=ISNULL(B,0), 
    [Count C]=ISNULL(C,0) 
from 
(select * from T)src 
pivot 
(count(Date) for Result in (A,B,C))p 

See working demo

相关问题