2012-03-07 75 views
1

的我在SSRS,需要做出一个图表2年的数据进行比较的图表。由于ssrs中的图表只能使用数据列来存储值,而不能使用行,所以我不得不写很长的包含很多联合的查询。我需要12个月的横轴,我不能创建一个新的表格或任何用户定义的功能。一切都必须在一个查询中。 有没有更简单的方法来完成这项任务?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 2012-03-07 16:06:54

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 2012-03-07 16:06:24