2009-06-01 14 views
2

Ich habe 5 Fragen, die ich gerne zusammen machen würde. Im Grunde gehen sie durch die Datenbank und wählen aus, wie viel ein Mieter bezahlt hat und wie viel ein Mieter schuldet, je nachdem wie lange er belastet wurde.Wie kann ich diese Abfragen kombinieren?

Ich habe vier Kategorien
Lade < 30 Tage alt
Lade < 60 und> = 30 Tage alt
Lade < 90 UND> = 60 Tage alt
Gebühr> 90 Tage alt

Ich weiß, Wie bekomme ich all diese Werte separat, aber wie bekomme ich sie zusammen, plus den Betrag, den der Mieter bezahlt hat?

Hier sind meine Fragen:
Betrag der Mieter bezahlt hat

SELECT TransactionCode, TenantID, SUM(Amount) AS Paid FROM tblTransaction 
WHERE Amount > 0 
GROUP BY TransactionCode, TenantID 

Gebühr weniger als 30 Tage alt ist

Gebühr weniger als 60 Tage alt ist, aber älter als 29 Tage

SELECT TransactionCode, TenantID, SUM(Amount) AS ChargedOver30 FROM tblTransaction 
WHERE Amount < 0 AND TransactionDate > DATEADD("dd", -60, GETDATE()) AND TransactionDate <= DATEADD("dd", -30, GETDATE()) 
GROUP BY TransactionCode, TenantID 

Gebühr ist weniger als 90 Tage alt, aber älter als 59 Tage

SELECT TransactionCode, TenantID, SUM(Amount) AS ChargedOver60 FROM tblTransaction 
WHERE Amount < 0 AND TransactionDate > DATEADD("dd", -90, GETDATE()) AND TransactionDate <= DATEADD("dd", -60, GETDATE()) 
GROUP BY TransactionCode, TenantID 

Gebühr ist älter als 89 Tage

SELECT TransactionCode, TenantID, SUM(Amount) AS ChargedOver90 FROM tblTransaction 
WHERE Amount < 0 AND TransactionDate <= DATEADD("dd", -90, GETDATE()) 
GROUP BY TransactionCode, TenantID 

Wie kann ich diese alle mit einem bekommen Abfrage?

Antwort

7

Es kann wie folgt geschehen:

SELECT TransactionCode, TenantID, 
SUM(CASE WHEN Amount > 0 then Amount ELSE 0 END) AS Paid, 
SUM(CASE WHEN Amount < 0 AND TransactionDate > DATEADD("dd", -30, GETDATE()) THEN Amount ELSE 0 END) AS ChargedCurrent, 
SUM(CASE WHEN Amount < 0 AND TransactionDate > DATEADD("dd", -60, GETDATE()) AND TransactionDate <= DATEADD("dd", -30, GETDATE()) THEN Amount ELSE 0 END) AS ChargedOver30 
SUM(CASE WHEN Amount < 0 AND TransactionDate > DATEADD("dd", -90, GETDATE()) AND TransactionDate <= DATEADD("dd", -60, GETDATE()) then Amount Else 0 END) AS ChargedOver60, 
SUM(CASE WHEN Amount < 0 AND TransactionDate <= DATEADD("dd", -90, GETDATE()) THEN Amount ELSE 0 END) AS ChargedOver90 
FROM tblTransaction 
GROUP BY TransactionCode, TenantID 
+0

Msg 102, Ebene 15, Status 1, Zeile 2 Falsche Syntax in der Nähe von ')'. – Malfist

+0

Sie brauchen 'END' am Ende der CASE-Anweisungen, das ist T-SQL – Malfist

+0

Yep! .... –

1

mit UNION zum Sticken der Ergebnissätze zusammen arbeiten würde. Möglicherweise möchten Sie es mithilfe der PIVOT-Funktionen übersetzen, um die Beträge in separaten Spalten zu erhalten. Entschuldigung, ich kann nicht genauer sein, ich habe meine Notizen nicht und ich kenne die genaue Syntax für dieses Zeug nicht von ganz oben.

0

eine zusätzliche Spalte zu jeder

Abfrage hinzufügen

SELECT TransactionCode, TenantID, SUM (Betrag) AS ChargedCurrent, 30 als [DaysLate] FROM tblTransaction .. UNION die alle Abfragen zusammen

1
.

und dann

Wenn Sie die Projektion oder die Form der Abfrage das gleiche in allen fünf Einzelabfragen machen können, können Sie Verwenden Sie eine Union, um die Abfragen nicht nur zu einem einzelnen Ergebnis zusammenzufassen, sondern auch die Ergebnisse zu ordnen.I'vee modifizierte letzte Spalte konsistent zu sein und repräsentieren die Ladung einen Zustand ist in für Ihre aus den Ergebnissen filtern:

SELECT TransactionCode, TenantID, SUM(Amount) [Amount], 'Paid' [Status] 
FROM tblTransactionWHERE Amount > 0 
GROUP BY TransactionCode, TenantID 

union 

SELECT TransactionCode, TenantID, SUM(Amount) [Amount], 'Charged Current' [Status] 
FROM tblTransactionWHERE Amount < 0 AND TransactionDate > DATEADD("dd", -30, GETDATE()) 
GROUP BY TransactionCode, TenantID 

union 

SELECT TransactionCode, TenantID, SUM(Amount) [Amount], 'ChargedOver30' [Status] 
FROM tblTransactionWHERE Amount < 0 AND TransactionDate > DATEADD("dd", -60, GETDATE()) AND TransactionDate <= DATEADD("dd", -30, GETDATE()) 
GROUP BY TransactionCode, TenantID 

union 

SELECT TransactionCode, TenantID, SUM(Amount) [Amount], 'ChargedOver60' [Status] 
FROM tblTransactionWHERE Amount < 0 AND TransactionDate > DATEADD("dd", -90, GETDATE()) AND TransactionDate <= DATEADD("dd", -60, GETDATE()) 
GROUP BY TransactionCode, TenantID 

union 

SELECT TransactionCode, TenantID, SUM(Amount) [Amount], 'ChargedOver90' [Status] 
FROM tblTransactionWHERE Amount < 0 AND TransactionDate <= DATEADD("dd", -90, GETDATE()) 
GROUP BY TransactionCode, TenantID 

order by 4 --Status 
+0

Gibt es sie trotzdem, um sie alle in einer Reihe zu bekommen, statt sich auf 5 Reihen auszubreiten? – Malfist

1

Diese Kreuztabelle Abfrage sollte funktionieren:

SELECT 
Case WHEN Amount > 0 Then Amount Else 0 End as [Total], 
Case WHEN Amount < 0 AND TransactionDate > DATEADD("dd", -30, GETDATE()) 
    Then Amount Else 0 End as [Charge 0-29 Days], 
Case WHEN Amount < 0 AND TransactionDate > DATEADD("dd", -60, GETDATE()) AND TransactionDate <= DATEADD("dd", -30, GETDATE()) 
    Then Amount Else 0 End as [Charge 30-59 Days], 
Case WHEN Amount < 0 AND TransactionDate > DATEADD("dd", -90, GETDATE()) AND TransactionDate <= DATEADD("dd", -60, GETDATE()) 
    Then Amount Else 0 End as [Charge 60-89 Days], 
Case WHEN Amount < 0 AND TransactionDate <= DATEADD("dd", -90, GETDATE()) 
    Then Amount Else 0 End as [Charge 90+ Days], 

VON tblTransaction GROUP BY TransactionCode, TenantID

+0

Nun Ratten, Mith schlagen mich dazu. Warum habe ich keine Update-Benachrichtigungen erhalten? – RBarryYoung