2016-11-30 2 views
0

Ich versuche, zwei verschiedene Werte in meiner Datenbank zu summieren.Korrekte Syntax, wenn SUM-Fall, wenn Anweisung formatiert ist

Species kann entweder 12 oder 14 sein. Ich habe den Rest in meiner Select-Anweisung entfernt.

Ich möchte insgesamt oder SUM für alle Zeilen zu tun, die eine Spezies Wert von 12 haben, und die gleiche, wenn die Spezies einen Wert von 14.

hat verstehe ich nicht, wie die Syntax zu formatieren. Das ist meine Abfrage:

SELECT h.HarvestDate, c.LotNo, h.Producer, c.species 
    SUM CASE WHEN c.Species = 12 THEN LambYT ELSE 0 as LambYT 
    SUM CASE WHEN c.Species = 14 THEN LambYTSpoolJoint ELSE 0 as LambYTSpoolJoint 
FROM BANSS.dbo.DixonCarcass_InProcess c, BANSS.dbo.HarvestData_SFDCApp h 
WHERE c.LotNo = h.Lot 
    AND c.Species in (12, 14) 
    AND h.Program not LIKE 'K&R%' 
GROUP BY h.HarvestDate, c.LotNo, h.Producer 

Allerdings glaube ich, das ist falsch. Ich möchte eine SUM, wo Species = 12 und eine Summe, wo Species = 14 und insgesamt die zwei Summen wie TOTAL.

Antwort

0

Versuchen Sie diese Abfrage:

SELECT h.HarvestDate, 
     c.LotNo, 
     h.Producer, 
     SUM(CASE WHEN c.Species = 12 THEN 1 ELSE 0 END) AS LambYT, 
     SUM(CASE WHEN c.species = 14 THEN 1 ELSE 0 END) AS LambYTSpoolJoint, 
     SUM(CASE WHEN c.Species = 12 THEN 1 ELSE 0 END) + 
     SUM(CASE WHEN c.species = 14 THEN 1 ELSE 0 END) AS TOTAL 
FROM BANSS.dbo.DixonCarcass_InProcess c 
INNER JOIN BANSS.dbo.HarvestData_SFDCApp h 
    ON c.LotNo = h.Lot 
WHERE c.Species IN (12, 14) AND 
     h.Program NOT LIKE 'K&R%' 
GROUP BY h.HarvestDate, c.LotNo, h.Producer 

Hinweise:

Es gibt keine Möglichkeit, eine einzelne Aggregation zu tun, um Ihre Gesamt zu bekommen, weil die Säulen für verschiedene Arten sind 12 und 14. So summiert werden, habe ich nur noch die jeweiligen CASE Ausdrücke zusammen.

Sie können c.species nicht auswählen, da es nicht in Ihrer SELECT-Liste angezeigt wird und es sich nicht um eine Aggregatfunktion handelt.

Ich ersetzte Ihre implizite Join durch eine explizite, wo die Join-Bedingung in einer ON Klausel erscheint. Dies ist jetzt der akzeptierte Standard und erleichtert das Lesen Ihrer Abfrage.

+0

Es kann eine gute Idee sein, c.species zu der vorgewählten Spaltenliste einzuschließen und sie auch in die Gruppierung einzubeziehen –

+0

Es gibt einen Fehler auf '+', ich denke nicht, dass es die Mathematik versteht, beide hinzuzufügen 12 und 14 zusammen. –

+0

@SualehFatehi Das kam mir in den Sinn, aber da er sich über die 'Spezies'-Kolumne angesammelt hatte, nahm ich an, dass er nicht damit gruppieren wollte. Andernfalls würde die Aggregation keinen Sinn ergeben. –

0

Ich bin nicht klar, genau das, was Sie wollen, aber versuchen Sie dies:

SELECT 
    h.HarvestDate, 
    c.LotNo, 
    h.Producer, 
    c.species, 
    SUM(LambYT) AS LambYT, 
    SUM(LambYTSpoolJoint) AS LambYTSpoolJoint 
FROM 
    BANSS.dbo.DixonCarcass_InProcess c, 
    BANSS.dbo.HarvestData_SFDCApp h 
WHERE 
    c.LotNo = h.Lot 
    AND c.Species IN (12, 14) 
    AND h.Program NOT LIKE 'K&R%' 
GROUP BY 
    h.HarvestDate, 
    c.LotNo, 
    h.Producer, 
    c.species 

oder, wie Tim B. vermuten lässt, versuchen:

SELECT 
    h.HarvestDate, 
    c.LotNo, 
    h.Producer, 
    c.species, 
    SUM(CASE WHEN c.Species = 12 THEN LambYT ELSE 0 END) AS LambYT, 
    SUM(CASE WHEN c.species = 14 THEN LambYTSpoolJoint ELSE 0 END) AS LambYTSpoolJoint 
FROM 
    BANSS.dbo.DixonCarcass_InProcess c, 
    BANSS.dbo.HarvestData_SFDCApp h 
WHERE 
    c.LotNo = h.Lot 
    AND c.Species IN (12, 14) 
    AND h.Program NOT LIKE 'K&R%' 
GROUP BY 
    h.HarvestDate, 
    c.LotNo, 
    h.Producer, 
    c.species 

oder, noch besser,

SELECT 
    h.HarvestDate, 
    c.LotNo, 
    h.Producer, 
    c.species, 
    CASE WHEN c.Species = 12 THEN SUM(LambYT) ELSE SUM(LambYTSpoolJoint) END AS LambYT 
FROM 
    BANSS.dbo.DixonCarcass_InProcess c, 
    BANSS.dbo.HarvestData_SFDCApp h 
WHERE 
    c.LotNo = h.Lot 
    AND c.Species IN (12, 14) 
    AND h.Program NOT LIKE 'K&R%' 
GROUP BY 
    h.HarvestDate, 
    c.LotNo, 
    h.Producer, 
    c.species 
+1

Dies kann nicht die beabsichtigten Ergebnisse geben, weil die Abfrage über alle Datensätze für Spezies 12 und 14 für beide Summen summiert. –

+0

Das ist sehr nah. Obwohl nicht genau das, was ich brauche. Die beiden SUM-Anweisungen für LambYT und LambYTSpoolJoint funktionieren nicht. Das LambYT ist die Spezies 12. Das LambYTSpoolJoint ist 14. Also ich denke, ich brauche ein Fallstatement, wenn die Spezies 12 ist, dann summiere sie als LambYT, wenn die Spezies 14 ist, dann summiere sie als LambYTSpoolJoint. Hoffentlich klärt das –