2010-12-15 8 views
0

Ich versuche, eine Abfrage in MS SQL 2005 zu erstellen, die Daten für 4 Datumsbereiche als separate Spalten in meiner Ergebnismenge zurückgibt.Verwenden von Groß-/Kleinschreibung zum Erstellen mehrerer Datenspalten

Im Moment sieht meine Abfrage wie die Abfrage unten aus. Es funktioniert gut, aber ich möchte die zusätzlichen Spalten für jeden Datumsbereich hinzufügen, da es derzeit einen Datumsbereich unterstützt.

Dies würde dann eine Total1, Total2, Total3 und Total 4 Spalte anstelle einer einzelnen Gesamtspalte wie die aktuelle Abfrage unten zurückgeben. Jede Summe würde die 4 Datumsbereiche darstellen:

Ich bin ziemlich sicher, dass dies mit Case-Anweisungen erreicht werden kann, aber bin nicht 100%.

Jede Hilfe würde sicherlich geschätzt werden.

SELECT 
     vendor,location, 
     sum(ExtPrice) as total 

    FROM [database].[dbo].[saledata] 
where processdate between '2010-11-03' and '2010-12-14' 

and location <>'' 
and vendor <> '' 

group by vendor,location with rollup 

Antwort

2

Ich mache es in der Regel wie folgt aus:

SELECT 
     vendor,location, 
     sum(CASE WHEN processdate BETWEEN @date1start AND @date1end THEN xtPrice ELSE 0 END) as total, 
     sum(CASE WHEN processdate BETWEEN @date2start AND @date2end THEN xtPrice ELSE 0 END) as total2, 
     sum(CASE WHEN processdate BETWEEN @date3start AND @date3end THEN xtPrice ELSE 0 END) as total3, 
     sum(CASE WHEN processdate BETWEEN @date4start AND @date4end THEN xtPrice ELSE 0 END) as total4  
    FROM [database].[dbo].[saledata] 

and location <>'' 
and vendor <> '' 

group by vendor,location with rollup 

Und Sie können den WHEN Abschnitt ändern Sie die gewünschte Datumsbereiche zu machen.

+0

Ja danke viel das funktioniert gut. Ich versuche auch den folgenden Ansatz für diesen Umstand. – joe

0

Verwenden Subqueries, dh

select sd.vendor, sd.location, sd1.total, sd2.total, sd3.total, sd4.total 
from (select distinct vendor, location from saledata) AS sd 
LEFT JOIN (
SELECT vendor,location, sum(ExtPrice) as total 
    FROM [database].[dbo].[saledata] 
where processdate between 'startdate1' and 'enddate1' 
and location <>'' 
and vendor <> '' 
group by vendor,location with rollup) sd1 on sd1.vendor=sd.vendor and sd1.location=sd.location 

LEFT JOIN (
SELECT vendor,location, sum(ExtPrice) as total 
    FROM [database].[dbo].[saledata] 
where processdate between 'startdate2' and 'enddate2' 
and location <>'' 
and vendor <> '' 
group by vendor,location with rollup) sd2 on sd2.vendor=sd.vendor and sd2.location=sd.location 

LEFT JOIN (
SELECT vendor,location, sum(ExtPrice) as total 
    FROM [database].[dbo].[saledata] 
where processdate between 'startdate3' and 'enddate3' 
and location <>'' 
and vendor <> '' 
group by vendor,location with rollup) sd3 on sd3.vendor=sd.vendor and sd3.location=sd.location 

LEFT JOIN (
SELECT vendor,location, sum(ExtPrice) as total 
    FROM [database].[dbo].[saledata] 
where processdate between 'startdate4' and 'enddate4' 
and location <>'' 
and vendor <> '' 
group by vendor,location with rollup) sd4 on sd4.vendor=sd.vendor and sd4.location=sd.location 
+0

Kann ich den zurückgegebenen Nullwert auf 0 setzen? Ich habe versucht, die isnull, aber es scheint nicht zu zwingen 0 – joe

+0

@joe - ich glaube, die Kosten, um diese Abfrage auszuführen ist mehr als meine Abfrage. Nichts für ungut, @SteveCav. joe, versuche, beide Abfragen in einem Abfrage-Analysator auszuführen und die Laufzeit und die Kosten jedes einzelnen zu vergleichen. – BeemerGuy

+0

Ich denke, Sie haben Recht mit den Abfragekosten. Ich habe gerade festgestellt, dass ich Daten aus einer älteren Datenbank abrufen muss, wenn sie unterhalb eines bestimmten Datums liegt, was es mir nicht erlaubt, Ihre Abfrage in ihrem aktuellen Zustand zu verwenden. – joe

Verwandte Themen