2016-10-20 5 views
1

Erster Beitrag hier.Fall in der Gruppe Nach Klausel

Die Abfrage unten läuft OK und bringt mir die Zahlen, die ich brauche. Das Problem ist, dass ich die oh.paid-Spalte in der GROUP BY-Klausel für die Abfrage ausführen muss. Das gibt mir zwei Ergebnisse pro oh.unitname, ich möchte nur eins.

Ich habe gesucht und einige verwandte Probleme gefunden, aber die Lösungen funktionierten nicht auf meine Abfrage.

Hoffen einige freundliche Seelen da draußen können mich in die richtige Richtung zeigen.

SELECT oh.unitname, 
    oh.CostCode, 
    CASE 
     WHEN oh.Paid = 1 
     THEN 'Kr '+CONVERT(VARCHAR(50), CAST(SUM(oh.paidsum * oh.ExchangeRate) AS MONEY), -1) 
     ELSE 'Kr '+CONVERT(VARCHAR(50), CAST(SUM(oh.totalprice * oh.ExchangeRate) AS MONEY), -1) 
    END AS Price 
    FROM dbo.OrderHead oh 
    WHERE oh.RowDeleted = 0 
    AND oh.UnitName LIKE '%%' 
    AND oh.DateCreated >= '2016-01-01' 
    AND oh.DateCreated < '2016-12-30' 
    AND oh.CostCode = 1 
    GROUP BY oh.UnitName, 
    oh.CostCode, 
    oh.Paid 
    ORDER BY oh.UnitName; 
+0

Willst du ein oder zwei Summen in das Ergebnis? – jarlh

+0

Haben Sie mehrere Zeilen, eine mit oh.paid = 1 und andere/s mit oh.paid <> 1? –

+0

Hallo, die oh.paid-Spalte haben 1 wenn bezahlt und dann 0 wenn nicht bezahlt. Ich möchte die beiden summieren, um eine Summe bezahlt und nicht bezahlt zu bekommen ... Hoffnung, die Sinn macht. – Tommel

Antwort

0

Ich glaube, Sie dies wünschen:

SELECT oh.unitname, oh.CostCode, 
     ('Kr ' + 
     CONVERT(VARCHAR(50), CAST(SUM(CASE WHEN oh.PAID = 1 THEN oh.paidsum * oh.ExchangeRate ELSE 0 END) AS MONEY), -1) 
     ) as PaidSum, 
     ('Kr ' + 
     CONVERT(VARCHAR(50), CAST(SUM(CASE WHEN oh.PAID <> 1 THEN oh.paidsum * oh.ExchangeRate ELSE 0 END) AS MONEY), -1) 
     ) as NotPaidSum 
FROM dbo.OrderHead oh 
WHERE oh.RowDeleted = 0 AND 
     oh.UnitName LIKE '%%' AND 
     oh.DateCreated >= '2016-01-01' AND 
     oh.DateCreated < '2016-12-30' 
     oh.CostCode = 1 
GROUP BY oh.UnitName, oh.CostCode, 
ORDER BY oh.UnitName; 

Damit werden die Summen in zwei Spalten aufspaltet. Es wird angenommen, dass oh.Paid nicht NULL ist. Wenn das möglich ist, ist es einfach, die zweite Bedingung zu ändern.

+0

Vielen Dank für das Betrachten. habe gerade deine Anfrage versucht, aber es ist nicht das, was ich brauchte. Ich möchte die "PaidSum" und "NotPaidSum" summieren. – Tommel

+0

@ Tommel. . . Dann behalte einfach diese Spalte und nicht die andere. –

+0

ich sehe kann sehen, wie Sie meinen Kommentar oben falsch verstehen würden. Die Abfrage, mit der Sie mir geholfen haben, erzeugt zwei Werte, ich muss diese beiden Werte jetzt nur addieren. – Tommel

0

Für die 2 Werte, die zu einem umgewandelt werden, möchten Sie sie SUMMEN? Wenn dem so ist dies versuchen:

select a.Unitname,a.CostCode, SUM(a.Price) as Price 
from 
(
SELECT oh.unitname, 
oh.CostCode, 
CASE 
    WHEN oh.Paid = 1 
    THEN 'Kr '+CONVERT(VARCHAR(50), CAST(SUM(oh.paidsum * oh.ExchangeRate) AS MONEY), -1) 
    ELSE 'Kr '+CONVERT(VARCHAR(50), CAST(SUM(oh.totalprice * oh.ExchangeRate) AS MONEY), -1) 
END AS Price 
FROM dbo.OrderHead oh 
WHERE oh.RowDeleted = 0 
AND oh.UnitName LIKE '%%' 
AND oh.DateCreated >= '2016-01-01' 
AND oh.DateCreated < '2016-12-30' 
AND oh.CostCode = 1 
) 
GROUP BY a.UnitName, 
a.CostCode 
ORDER BY a.UnitName 

Dies ermöglicht es Ihnen die bezahlte Spalte nach den ersten Änderungen in dem Fall Aussage gemacht zu summieren.

Ich hoffe, das macht Sinn

0

für einige Ihrer oh.unitname weil Mai und/oder oh.costname die oh.paid unterscheidet. So wird es für bezahlt = 1 getrennt und sonst getrennt

Verwandte Themen