2016-07-21 8 views
0

Ich brauche eine neue Spalte zu erstellen, in dem folgendes beachtet wird:T-SQL: Loop in CASE-Anweisung

  • Wenn alleOrder_ID innerhalb einID haben eine Approved Flagge von und Denied flag , Dann kennzeichnen sie als Freigegeben. (Beispiel: ID 1)

  • Wenn alleOrder_ID innerhalb eines ID eine Flagge von Approved und Denied Flagge , kennzeichnen sie dann als verweigert. (Beispiel: ID 2)

  • Wenn einigeOrder_ID innerhalb einemID eine Approved Flagge und Denied Flagge und die anderen sind entweder mit einem Approved Flagge und Denied flagge von oder eine Approved flagge von und Denied flagge von , Dann kennzeichnen Sie es als Teilweise genehmigt. (Beispiel: ID 3 und 6)

  • Wenn jedeOrder_ID innerhalb einemID eine Approved Flagge und Denied Flagge unabhängig von der anderen Order_ID innerhalb des ID, kennzeichnen sie dann als Fehler. (Beispiel: ID 4)
  • Wenn alleOrder_ID innerhalb eines ID eine Flagge von Approved und Denied Flagge , kennzeichnen sie dann als Ausstehende Genehmigung.(Beispiel: ID 5)

Dies ist eine vereinfachte Tabelle I als Beispiel verwenden:

**ID  Order_ID Approved Denied 
    1   101   1   0 
    2   201   0   1 
    2   202   0   1 
    1   102   1   0 
    4   401   0   1 
    3   301   0   1 
    6   601   0   1 
    1   103   1   0 
    3   302   1   0 
    3   303   0   0 
    5   501   0   0 
    4   402   1   0 
    6   602   1   0 
    5   502   0   0 
    4   403   1   1 
    5   503   0   0 

und das ist das Ergebnis, das ich erwarte:

**Id  Order_ID Approved Denied Approval_status 
    1   101   1   0  Approved 
    2   201   0   1   Denied 
    2   202   0   1   Denied 
    1   102   1   0  Approved 
    4   401   0   1   Error 
    3   301   0   1 Partially approved 
    6   601   0   1 Partially approved 
    1   103   1   0  Approved 
    3   302   1   0 Partially approved 
    3   303   0   0 Partially approved 
    5   501   0   0  Pending Approval 
    4   402   1   0  Error 
    6   602   1   0 Partially approved 
    5   502   0   0  Pending Approval 
    4   403   1   1  Error 
    5   503   0   0  Pending Approval 

Vielen Dank viel im Voraus !! Ich bin hauptsächlich verwirrt, wie innerhalb einer ID in einer CASE-Anweisung Schleife.

+0

Verwenden Sie keine Schleife. Erstellen Sie die Spalte und führen Sie dann 3 oder 4 Aktualisierungen durch, um Ihre Geschäftsregeln in der richtigen Reihenfolge zu erstellen. ** KEINE LOOPS IN SQL! ** – Hogan

+0

@hogan wie bleibe ich nur innerhalb einer ID? –

+0

Wenn Sie nicht mit Sets arbeiten, bedeutet dies, dass Sie eine Änderung auf alle IDs anwenden, die eine Anforderung erfüllen. Wenn Sie beispielsweise nach ID gruppieren, können Sie die Anzahl (*) mit der Summe (*) vergleichen, um festzustellen, ob ein Feld für jedes Element 1 ist. – Hogan

Antwort

1

Ich nehme meinen Kommentar oben zurück.

WITH CTE AS (
    SELECT 
     COUNT(*) AS NumberOfOrder 
     , SUM(Approved) AS NumberOfApproved 
     , SUM(Denied) AS NumberOfDenied 
     , SUM(IIF(Approved=1 AND Denied=1,1,0)) AS NumberOfError 
     , ID 
    FROM 
     TestTable T1 
    GROUP BY 
     T1.ID 
) 
SELECT 
    T2.* 
    , CASE 
     WHEN CTE.NumberOfError > 0 THEN 'Error' 
     WHEN CTE.NumberOfApproved=CTE.NumberOfOrder THEN 'Approved' 
     WHEN CTE.NumberOfDenied=CTE.NumberOfOrder THEN 'Denied' 
     WHEN CTE.NumberOfApproved>0 OR CTE.NumberOfDenied > 0 THEN 'Partially Approved' 
     ELSE 'Pending Approval' 
    END AS Approval_Status 
FROM 
    TestTable T2 
    JOIN CTE ON T2.ID=CTE.ID