2016-08-08 5 views
0

ケースステートメントを追加して、「すべて完了しましたか? 「すべて完了」=「Y」のすべての行を除外または除外します。複数の列の値に基づくケースステートメント

「すべて完了」をYに設定するには、すべてのID_Statusを各顧客と各コード番号について完了する必要があります。各顧客は、複数のIDまたはCode_Numberを持つことができます。私は値が常に同じではない複数の列にわたってCASEロジックを理解することに問題があります。助けてくれてありがとう。

IDTable: 
ID ID_Status Customer Code_Number All Complete? 

1 Complete Alex  123   Y 
2 Complete Alex  123   Y 
3 Complete Brian  321   Y 
4 Complete Brian  321   Y 
5 Open  Brian  425   N 
6 Complete Brian  425   N 
7 Open  Charlie 123   N 
8 Complete Charlie 123   N 
9 Open  Charlie 123   N 
10 Complete Donald 555   N 
11 Complete Donald 555   N 
12 Testing Donald 555   N 
13 Complete Eric  620   Y 

答えて

1

SQL Serverの2008+と仮定すると:

WITH CTE AS 
(
    SELECT *, 
      COUNT(*) OVER(PARTITION BY Customer, Code_Number) Total, 
      SUM(CASE WHEN Id_Status = 'Complete' THEN 1 ELSE 0 END) OVER(PARTITION BY Customer, Code_Number) Completed 
    FROM dbo.YourTable 
) 
SELECT ID, 
     ID_Status, 
     Customer, 
     Code_Number, 
     CASE WHEN Total = Completed THEN 'Y' ELSE 'N' END [All Complete] 
FROM CTE; 
+0

OPはCode_Number'も良いキャッチ@techspider 'Complete' – techspider

+0

、感謝のために検討する必要があります'。 SELECT ID、 ID_Status、 お客様、 Code_Number、 CASE THEN 'Y' ELSE 'N' 完了合計=:私の答え – Lamak

+0

こんにちは@Lamak更新、代わりにCTEを使用して、私は(書式設定のための謝罪を)使用することができますEND [すべて完了] ( SELECT * FROM 、 COUNT(*お客様BY)OVER(PARTITION、Code_Number)合計、 SUM(CASE WHEN(PARTITION OVER)THEN 1つのELSE 0 END Id_Status = 'コンプリート' By Customer、Code_Number) FROM dbo.YourTable – bojackh

0
Select * 
    , CASE WHEN EXISTS 
        (SELECT 1 FROM TableName t1 
         Where t1.Customer = t2.Customer 
         AND t1.Code_Number = t2.Code_Number 
         AND t1.ID_Status <> 'Complete' 
        ) 
      THEN 'N' ELSE 'Y' END AS [All Complete?] 

from TableName t2 
関連する問題