Преобразование SQL запроса в таблицу с помощью сводной таблицы - PullRequest
1 голос
/ 17 июня 2020

Могу ли я узнать, как изменить запрос SQL ниже, чтобы результат превратился в ожидаемый результат с использованием сводной таблицы where () в For MonthYear = Start Date и End Date, выбранные пользователем?

SQL Запрос: SQL Результат запроса (Изображение)

Ожидаемый результат: Таблица (Изображение)

                   SELECT * FROM

(

SELECT WR.Work_Type,
                    LEFT(DATENAME(MONTH,WR.Request_Date),3)+' '+STR(YEAR(WR.Request_Date),4) AS MonthYear,
                    CONVERT(INT,STR(YEAR(WR.Request_Date),4)+REPLACE(STR(MONTH(WR.Request_Date),2),' ','0') ) AS MonthYearOrder,
                    COUNT(ISNULL(WR.Request_ID,0)) AS Total 
                    FROM tblWork_Request WR
                     INNER JOIN vWorkTypeByPropertyLevel WT ON WR.CoID=WT.CoID AND WR.Work_Type=WT.Work_Type AND WT.IsWorkRequest=1 
                     LEFT JOIN [UBERIQ_1.5_Property].[dbo].[tblProperty] P ON WR.Property_ID=P.Property_ID                          
                    WHERE WR.CoID='59' and WR.Property_ID='MCST001' 
                    GROUP BY WR.Work_Type,LEFT(DATENAME(MONTH,WR.Request_Date),3)+' '+STR(YEAR(WR.Request_Date),4),
                    CONVERT(INT,STR(YEAR(WR.Request_Date),4)+REPLACE(STR(MONTH(WR.Request_Date),2),' ','0') ) 

) t
pivot (
SUM(Total)
FOR MonthYear IN ()

) as pivot_table

Результат: -

Work_Type          | MonthYear | MonthYearOrder | Total
----------------------------------------------------------
A.1 Problem Code 1 | Jun 2020  | 202006         | 3
AHU faulty         | Nov 2020  | 202011         | 6
AirCondition       | May 2020  | 202005         | 1
Exterior           | Jun 2020  | 202006         | 2

Ожидаемый результат: -

Work Type           | Jan 2020 | Feb 2020 | Mar 2020 | Apr 2020 | May 2020 | Jun 2020 | Jun 2020 | Jul 2020 | Aug 2020 | Sep 2020 | Oct 2020 | Nov 2020 | Dec 2020 |
-----------------------------------------------------------------------------------------------------------------------------------------------------------
A.1 Problem Code 1  | 0        | 0        | 0        | 0        | 0        | 3        | 0        | 0        | 0        | 0        | 0        | 0        | 0        |  
AHU Faulty          | 0        | 0        | 0        | 0        | 0        | 0        | 0        | 0        | 0        | 0        | 0        | 6        | 0    |
AirCondition        | 0        | 0        | 0        | 0        | 1        | 0        | 0        | 0        | 0        | 0        | 0        | 0        | 0   |
Exterior            | 0        | 0        | 0        | 0        | 0        | 2        | 0        | 0        | 0        | 0        | 0        | 0        | 0   |

Пожалуйста, сообщите. Спасибо.

1 Ответ

0 голосов
/ 17 июня 2020
--Variables for dynamic columns and query
DECLARE @columns NVARCHAR(MAX) = ''
DECLARE @ifnullcolumns     NVARCHAR(MAX) = ''
DECLARE @query     NVARCHAR(MAX)

;WITH months(YearMonth) AS
(
    SELECT 202001
    UNION ALL
    SELECT YearMonth + 1
    FROM months
    WHERE YearMonth < 202012
)

SELECT 
     @columns += QUOTENAME(YearMonth) + ',',
     @ifnullcolumns += 'ISNULL(' + QUOTENAME(YearMonth) + ', 0) AS ' + QUOTENAME(YearMonth)+','
FROM 
    months

-- remove last , from the column list
SET @columns = LEFT(@columns, LEN(@columns) - 1)
SET @ifnullcolumns = LEFT(@ifnullcolumns, LEN(@ifnullcolumns) - 1)

-- Building dynamic query with pivot
SET @query ='
SELECT Work_Type, '+ @ifnullcolumns +' FROM (
    select Work_Type, MonthYerOrder, Total
    from Sample) t
PIVOT(
    SUM(Total)
    FOR MonthYerOrder IN ('+ @columns +')
) AS pivot_table;'

EXECUTE sp_executesql @query

Результат этого запроса: http://sqlfiddle.com/#! 18/96333/63

...