2017-03-01 6 views
-1

私は以下のようなフォーマットのテーブル行を持っています。ステータスに基づいて行を数える必要があります。SQL Serverの特定の値を持つ行を数えるには?

例えば:

+----+-----------+----------------+ 
|SNo | Operation | Status   | 
+----+-----------+----------------+ 
|1 | OP10 | Complete  | 
|1 | OP10 | Complete  | 
|2 | OP10 | Complete  | 
|2 | OP10 | Complete  | 
|2 | OP10 | Complete  | 
|3 | OP20 | InProgress  | 
|3 | OP20 | InProgress  | 
|3 | OP20 | InProgress  | 
|4 | OP30 | Ready   | 
|4 | OP30 | Ready   | 
+----+-----------+----------------+ 

出力:

Sno Operation CountStatus 
---------------------------- 
1  OP10   2 
2  OP10   3 
3  OP20   3 
4  OP30   0 

私は、ステータスが '完全な' & 'INPROGRESS' である場合にカウントする必要があります。ステータスが「Ready」の場合は、カウントが「0」であることを示す必要があります。

+0

case文で集計関数を試しましたか? – Azar

+0

'OP10'が5の' CountStatus'を表示しないようにしますか?または、あなたの結果に「ステータス」の説明が含まれていますか? – 3BK

+0

sno2については、OP10 2をSno 1&OP10 3に表示したい。私はOP10を5に見せたくありません。スノは違うからです。 – Dhamo

答えて

5

使用条件の集約:

作成し、移入したサンプルテーブル(私たちのセーブくださいあなたの将来の質問では、このステップ)

Declare @T as table 
(
    Sno int, 
    Operation char(4), 
    Status varchar(10) 
) 

INSERT INTO @T VALUES 
(1, 'OP10', 'Complete'), 
(1, 'OP10', 'Complete'), 
(2, 'OP10', 'Complete'), 
(2, 'OP10', 'Complete'), 
(2, 'OP10', 'Complete'), 
(3, 'OP20', 'InProgress'), 
(3, 'OP20', 'InProgress'), 
(3, 'OP20', 'InProgress'), 
(4, 'OP30', 'Ready'), 
(4, 'OP30', 'Ready') 

クエリ:

SELECT Sno, 
     Operation, 
     SUM(CASE WHEN Status IN('Complete', 'Inprogress') THEN 1 ELSE 0 END) As CountStatus 
FROM @T 
GROUP BY Sno, Operation 
ORDER BY Sno 

結果:

Sno Operation CountStatus 
1 OP10  2 
2 OP10  3 
3 OP20  3 
4 OP30  0 
+0

これはうまくいっていますが、sno2のためにOP10 2をSno 1&OP10 3に表示したいとします。私はOP10を5に見せたくありません。スノは違うからです。 – Dhamo

+0

これは、group by節に 'Sno'と' Operation'の両方が含まれている理由です。 –

0

パフォーマンスが賢明これは

がでTABLE1 グループからSNO、操作、COUNT(SNO)を選択し、この文字列で検索してくださいより良い

Select t.sno,t.operation, tt.cno 
from (select distinct t.sno, t.operation from tablename t) t 
inner join (select t.sno, 
cno = count(case when Status in ('Complete', 'InProgress') then 1 else null end) 
        from tablename group by sno)tt on t.sno = tt.sno 
0

私が使用しているシンプルcase文

SELECT 
     SNO,Operation,SUM(CASE Status WHEN 'Complete' THEN 1 
            WHEN 'InProgress' THEN 1 
            WHEN 'Ready' THEN 0 END) AS Cnt_Status 
FROM Your_table 
GROUP BY SNO,Operation 
0

だろうsno、operation

関連する問題