Requête de l'organigramme SQL Server Reporting Services Comment se débarrasser des syndicats

Je suis dans les SSR et j'ai besoin de faire un graphique qui compare 2 années de données sur un seul graphique. Puisque les charts dans ssrs ne peuvent utiliser que des colonnes de données pour des valeurs et non des lignes, je suis obligé d'écrire une requête très longue avec beaucoup de syndicats. J'ai besoin de 12 mois pour l'axe horizontal et je ne peux pas créer une nouvelle table ou des fonctions définies par l'user. tout doit être dans une requête. Y a-t-il un moyen plus facile d'accomplir cette tâche?

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 

Essayer:

 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) 

Vous pouvez faire avec un CURSOR dans une procédure stockée et faire une boucle à travers chacun des mois 1-12, vous devez juste sortir l' SELECT avec votre 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 

Cela charge datatables dans une table temporaire qui est supprimée une fois la procédure terminée.