2012-03-07 4 views
1

Я нахожусь в ssrs и вам нужно составить диаграмму, которая сравнивает 2 года данных на одном графике. Поскольку диаграммы в ssrs могут использовать только столбцы данных для значений, а не строки, я вынужден писать очень длинный запрос с большим количеством союзов. Мне нужно 12 месяцев для горизонтальной оси, и я не могу создать новую таблицу или любые пользовательские функции. все должно быть в одном запросе. Есть ли более простой способ выполнить эту задачу?Запрос диаграммы служб отчетов SQL Server. Как избавиться от профсоюзов

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

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) 
+0

Спасибо! Отлично! – Beninja2

0

Вы можете сделать с этим в CURSOR в хранимой процедуре и петли через каждый месяц 1-12, вы бы просто из которых в 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

Смежные вопросы