Запрос диаграммы служб отчетов SQL Server. Как избавиться от союзов - PullRequest
1 голос
/ 07 марта 2012

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

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

Ответы [ 2 ]

3 голосов
/ 07 марта 2012

Попробуйте:

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 голосов
/ 07 марта 2012

Вы можете сделать с этим 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

Загружает данные во временную таблицу, которая удаляется после завершения процедуры.

...