2010-12-15 8 views
0

MS SQL 2005で4つの日付範囲のデータを結果セットの別々の列として返すクエリを作成しようとしています。ケースを使用して複数のデータ列を作成する

今、私の質問は以下のようになります。それはうまく動作しますが、現在の日付範囲をサポートしているので、各日付範囲に追加の列を追加したいと考えています。

これは、現在のクエリのように1つの合計列ではなく、total1、total2、total3、およびtotal4の列を返します。それぞれの合計は4つの日付範囲を表します。

これはケースステートメントを使用して達成できるとは確信していますが、100%ではありません。

ご協力いただければ幸いです。

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 

答えて

2

私は通常、このようにそれを行う:

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 

そして、あなたがご希望の日付の範囲を作るためにWHEN部分を変更することができます。

+0

ありがとうございます。私はこのような状況のために以下のアプローチを試みています。 – joe

0

使用サブクエリ、すなわち

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

返されるnull値を0にすることはできますか?私はisnullを試しましたが、0に強制するようには見えません。 – joe

+0

@joe - このクエリを実行するコストは私のクエリ以上です。犯罪はありません@SteveCav。クエリアナライザで両方のクエリを実行し、それぞれの実行時間とコストを比較してみてください。 – BeemerGuy

+0

私はあなたが質問のコストについて正しいと思います。私はちょうど私が古いデータベースからデータを取得する必要があることを認識しました。それは特定の日付よりも低い場合、現在の状態でクエリを使用することができません。 – joe

関連する問題