2012-04-06 4 views
1

Ich habe einige Probleme mit der Abfrage unten. Ich versuche festzustellen, ob das Feld "Kategorie" A, B oder C ist und dann ein Feld basierend auf der Kategorie erstellt. Dieses Feld würde das Zahlungsfeld zusammenfassen. Aber ich renne in Fehler "falsche Syntax in der Nähe von Schlüsselwort As". Ich erstelle dies in einer SQL-Ansicht. Verwenden von SQL Server 2008Versuchen, Felder basierend auf einer case-Anweisung zu erstellen

SELECT r.id, r.category 
CASE 
WHEN r.category = 'A' then SUM(r.payment) As A_payments 
WHEN r.category = 'B' then SUM(r.payment) As B_payments 
WHEN r.category = 'C' then SUM(r.payment) As C_payments 
END 
FROM r_invoiceTable As r 
GROUP BY r.id, r.category 

Ich habe Daten, bei denen alle oben genannten Fälle ausgeführt werden sollte, weil die Daten, die ich habe A, B und C

Probe Data- r_invoiceTable

Id --- Category ---- Payment 
222  A  ---- 50 
444  A  ---- 30 
111  B  ---- 90 
777  C  ---- 20 
555  C  ---- 40 

hat Gewünschter Ausgang A_Zahlungen = 80, B_Zahlungen = 90, C_Zahlungen = 60

+0

Ja, aber ich möchte 3 separate Felder haben ... Ich kann nicht nur ein Feld haben. Ich brauche 3 separate Felder, die mit der Summe der Zahlung basierend auf der Kategorie erstellt werden. – dido

+0

für jede Kategorie, die Sie gerade berechnen '' SUM'; Was ist der Sinn von 'CASE'? – mshsayem

+0

@mshsayem gut jede Kategorie würde eine andere Summe haben. Deshalb muss ich es nach Kategorien trennen – dido

Antwort

4

Vielleicht für diese Sie suchen:

SELECT 
    SUM(CASE WHEN category = 'A' THEN payment END) AS A_payments, 
    SUM(CASE WHEN category = 'B' THEN payment END) AS B_payments, 
    SUM(CASE WHEN category = 'C' THEN payment END) AS C_payments 
FROM r_invoiceTable 
+0

ja das ist was ich brauchte, danke! – dido

1

Kann diese (kategorieseitige Zahlungssumme) gewünscht werden ?:

SELECT r.category, SUM(r.payment) As Payments 
FROM r_invoiceTable As r 
GROUP BY r.category 

Ausgang wird wie:

category  Payments 
--------- ------------ 
    A   80 
    B   90 
    C   60 

Wenn Sie diese Zahlen in einer einzigen Zeile wie hier ein naiver Ansatz ist:

SELECT 
    (SELECT SUM(r.payment) From r_invoiceTable As r Where r.category = 'A') as A_Payment, 
    (SELECT SUM(r.payment) From r_invoiceTable As r Where r.category = 'B') as B_Payment, 
    (SELECT SUM(r.payment) From r_invoiceTable As r Where r.category = 'C') as C_Payment 
+0

Nun, wird die obige Lösung mich mit 3 separaten Spalten versorgen? Weil ich in meiner Webapplikation 3 separate Spalten platzieren muss. – dido

1
SELECT * 
FROM dbo.r_invoiceTable 
PIVOT 
(SUM(payment) 
FOR category IN ([a],[b],[c]) 
) AS pivoted 
+1

Sie müssten die Spalten in der Quelle auf "Zahlung" und "Kategorie" beschränken. Ansonsten würden "id" und andere Spalten, falls vorhanden, ebenfalls an der Gruppierung teilnehmen. I.e. anstelle von 'FROM dbo.r_invoiceTable' müssten Sie' FROM (SELECT payment, Kategorie FROM dbo.r_invoiceTable) alias' auswählen. –

Verwandte Themen