2017-10-10 5 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 

すべての異なるコード、各コードのすべてのインスタンスの数、結果に基づく各コードの数を選択するクエリを作成する必要があります。だから、最終的な結果は次のようになります。いくつかの他の属性に基づく1つの属性のインスタンスの数

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の唯一の結果値はありますか?もしそうなら、これはOKです。より多くの値がある場合、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

関連する問題