2012-03-07 28 views
1

私はssrsに入っており、2年間のデータを1つのチャートで比較するグラフを作成する必要があります。 ssrsのグラフは行の値ではなくデータの列しか使用できないため、たくさんのユニオンで非常に長いクエリを作成する必要があります。私は水平軸の12ヶ月が必要と私は新しいテーブルまたは任意のユーザー定義関数を作成することはできません。すべてが1つのクエリ内になければなりません。 このタスクを実行する簡単な方法はありますか?SQL Server Reporting Servicesのグラフクエリ。

SELECT 
'01' AS 'MONTH', 
(SELECT COUNT(*) FROM Order JOIN Car ON Order.Car_ID = Car.ID JOIN CarType ON Car.CarType_ID = CarType.ID WHERE @Year = YEAR(Order.OrderDate) AND (@GPI IS NULL OR @GPI = CarType.GPI) AND (@CarType_ID IS NULL OR @CarType_ID = CarType.ID) AND '01' = MONTH(Order.OrderDate)) AS 'Orders1', 
(SELECT COUNT(*) FROM Order JOIN Car ON Order.Car_ID = Car.ID JOIN CarType ON Car.CarType_ID = CarType.ID WHERE @Year -1 = YEAR(Order.OrderDate) AND (@GPI IS NULL OR @GPI = CarType.GPI) AND (@CarType_ID IS NULL OR @CarType_ID = CarType.ID) AND '01' = MONTH(Order.OrderDate)) AS 'Orders2' 
UNION 
SELECT 
'02' AS 'MONTH', 
(SELECT COUNT(*) FROM Order JOIN Car ON Order.Car_ID = Car.ID JOIN CarType ON Car.CarType_ID = CarType.ID WHERE @Year = YEAR(Order.OrderDate) AND (@GPI IS NULL OR @GPI = CarType.GPI) AND (@CarType_ID IS NULL OR @CarType_ID = CarType.ID) AND '02' = MONTH(Order.OrderDate)) AS 'Orders1', 
(SELECT COUNT(*) FROM Order JOIN Car ON Order.Car_ID = Car.ID JOIN CarType ON Car.CarType_ID = CarType.ID WHERE @Year -1 = YEAR(Order.OrderDate) AND (@GPI IS NULL OR @GPI = CarType.GPI) AND (@CarType_ID IS NULL OR @CarType_ID = CarType.ID) AND '02' = MONTH(Order.OrderDate)) AS 'Orders2' 

--It goes on for 12 months 

答えて

3

試してみてください。

select MONTH(Order.OrderDate) as [MONTH], 
     COUNT(CASE WHEN @Year = YEAR(Order.OrderDate) THEN 1 END) as [Orders1], 
     COUNT(CASE WHEN @Year-1 = YEAR(Order.OrderDate) THEN 1 END) as [Orders2] 
from Order 
JOIN Car ON Order.Car_ID = Car.ID 
JOIN CarType ONCar.CarType_ID = CarType.ID 
WHERE (@GPI IS NULL OR @GPI = CarType.GPI) AND 
     (@CarType_ID IS NULL OR @CarType_ID = CarType.ID) 
group by MONTH(Order.OrderDate) 
+0

ありがとう!これは素晴らしい! – Beninja2

0

あなたは月1〜12の各を通じてストアドプロシージャとループでこのCURSORで行うことができ、あなたの希望だけでどのあなたSELECTステートメントを使用してSELECT声明アウト。

CREATE PROCEDURE [dbo].[test] 
AS 
BEGIN 
    SET NOCOUNT ON; 

    CREATE TABLE #temp 
    (
     [Month]  int 
     , Orders1 int 
     , Orders2 int 
    ) 

    DECLARE @MonthCount int 
    SET @MonthCount = 1   

    WHILE @MonthCount <= 12 
     BEGIN 
     INSERT INTO #temp 
     SELECT @MonthCount, (@MonthCount + 1) as Orders1, (@MonthCount + 2) as Orders2  

     SET @MonthCount = @MonthCount + 1 
     END 

    SELECT [Month], Orders1, Orders2 
    FROM #temp 

    DROP TABLE #temp 
END 

これは、プロシージャが完了すると削除される一時表にデータをロードします。

+0

我々は最終的にデータウェアハウスに私達のデータベースを変更する場合がありますので、私は物事をシンプルに保つためにストアドプロシージャを避けるためにしようとしています。 – Beninja2

関連する問題