Reputation: 658
I'm in ssrs and need to make a chart that compares 2 years of data on a single chart. Since charts in ssrs can only use columns of data for values and not rows I'm forced to write a very long query with lots of unions. I need the 12 months for the horizontal axis and I cant create a new table or any user defined functions. everything has to be in one query. Is there an easier way to accomplish this task?
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
Upvotes: 1
Views: 445
Reputation:
Try:
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)
Upvotes: 3
Reputation: 247680
You can do with this a CURSOR
in a stored procedure and loop through each of the month 1-12, you would just which out the SELECT
statement with your SELECT
statement.
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
This loads the data into a temp table that is dropped once the procedure has completed.
Upvotes: 0