2017-08-31 3 views
0

Das Problem verortet sich in der 4. Zeile der SELECT-Anweisung auf: CASE WHEN ct.TransactionReason=622 THEN ABS(ct.netquantity) ELSE c.RealNetWeight END AS NetWeightSQL CASE mischt meine Gruppierung

Wenn ich diese Zeile auf die Erklärung hinzufügen, ändern sich meine Gruppierung. Anstatt eine Zeile zurückzugeben gibt es mir jetzt die Anzahl der Zeilen verschiedener c.realnetweight zurück. Problem ist, dass ich nur eine Zeile zurückgeben möchte. So ähnlich wie ein Coalesce, dass wenn es eine ct.transactionreason = 622 gibt, sollte es mir ABS(ct.netquantity) geben, sonst die c.realnetweight. Code kann unten gefunden werden, Vorschläge wären sehr hilfreich. Vielen Dank.

SELECT CASE WHEN P.Wrapped = 1 THEN T.[Level]+1 ELSE T.[Level] END AS [Level] 
     , @CoilId AS CoilId 
     , c.SupplierCoilID 
     , CASE WHEN ct.TransactionReason=622 THEN ABS(ct.netquantity) ELSE c.RealNetWeight END AS NetWeight 
     , C.RealGrossWeight 
     , p1.Description 
     , p1.product 
     , s.StackID 
     , s.ProductID 
     , s.Weight 
     , P.Product 
     , P.Description AS 'ProductDescription' 
     , COUNT(t.BlankId) AS 'NumberOfBlanks' 
     , c1.Description as 'Status' 
     , pv.ProductionWeight 
     , pv.BlankWeight 
     , t.BlankStatus 

FROM @Trace T 
    INNER JOIN SKUTraceability SKUT ON SKUT.SKUID = T.SKUID 
    INNER JOIN Stack s ON SKUT.StackID = s.StackID 
    INNER JOIN Product p ON s.ProductID = p.ProductID 
    INNER JOIN Coil c ON [email protected] 
    INNER JOIN CoilTransaction ct on [email protected] 
    INNER JOIN Product p1 ON c.ProductID=p1.ProductID 
    INNER JOIN Code c1 ON t.BlankStatus=c1.codenumber AND c1.codetypeid=17 
    INNER JOIN @ProductVersion pv ON pv.ProductID=p.ProductId AND s.ProductVersion = pv.ProductVersion 

WHERE t.BlankId IS NOT NULL 

GROUP BY T.[Level] 
     , c.SupplierCoilID 
     , CASE WHEN ct.TransactionReason=622 THEN ABS(ct.netquantity) ELSE c.RealNetWeight END 
     , c.RealGrossWeight 
     , p1.Description 
     , p1.product 
     , s.StackID 
     , s.ProductID 
     , s.Weight 
     , p.Product 
     , p.Description 
     , c1.Description 
     , pv.ProductionWeight 
     , pv.BlankWeight 
     , p.Wrapped 
     , t.BlankStatus 
+0

wie über Sie den Fall, wenn in der Gruppe von Säulen entfernen und stattdessen ersetzen sie durch NetWeight Spalt? – StackTrace

+1

Dann gibt es mir einen Fehler über ct.transactionreason und ct.netquantity nicht in der Funktion GROUP BY oder AGGREGATE. –

+1

Sie müssen sie in der Gruppe durch oder in einer Aggregatklausel hinzufügen. Also, wenn du ein anderes 'c.realnetweight' hast, welches in deiner' one row' angezeigt werden sollte - das kleinere, das größte oder was? – gotqn

Antwort

0

Schwer zu beantworten, ohne jedoch Ihre Tabellenstrukturen zu verstehen, scheint es, dass CoilTransaction irgendeine Art von Transaktionstabelle ist, das heißt ein einzelnes Produkt kann viele Transaktionen haben.

In Ihrer SELECT Abfrage, die Linie, die Sie Probleme verursacht, ist die einzige Linie, die Ihre CoilTransaction Tabelle verweist deshalb glaube ich, der Grund, warum Sie mehrere Zeilen sind Rückkehr ist, weil Sie auf einem Wert sind die Gruppierung, die nicht eindeutig ist. Außerdem sind Transaktionen einzelne Artikel, weil Sie scheinen, eine Menge Spalte in der Tabelle zu haben.

Kurz gesagt, Sie können die gewünschte Gruppierung nicht erhalten, indem Sie diese Spalten in Ihre Transaktionstabelle aufnehmen. Sie müssten mehr darüber herausfinden, was Sie erreichen möchten, um eine geeignetere Lösung zu finden. Was bedeutet diese Zeile?

0

mindestens ein CoilID in Tabelle Für Coil, werden Sie mehr als einen Wert im Bereich netquantity in der Tabelle CoilTransaction haben. Dies führt dazu, dass die Anzahl der zurückgegebenen Datensätze steigt, wenn Sie dieses Feld in Ihre CASE-Anweisung aufnehmen.

Ich würde empfehlen, die netquantity Wert, den Sie wollen von CoilTransaction in einem CTE, und dann bringen dies in Ihre CASE Aussage. Zum Beispiel:

;WITH transaction_summary AS (
SELECT 
    ct.CoilID, 
    ct.TransactionReason, 
    MAX(ct.netquantity) -- choose your aggregate function here 
FROM 
    CoilTransaction ct 
GROUP BY 
    ct.CoilID, 
    ct.TransactionReason 
) 
...