【问题标题】:Convert SQL Query to Table Using Pivot Table使用数据透视表将 SQL 查询转换为表
【发布时间】:2020-06-17 08:06:55
【问题描述】:

我可以知道如何修改下面的 SQL 查询,以便使用数据透视表 where () in For MonthYear = Start Date and End Date by user selected 将结果变成预期结果吗?

SQL 查询:SQL Query Result(图片)

预期结果:Table(图片)

                   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   |

请指教。谢谢。

【问题讨论】:

  • 请不要使用图片,将您的查询示例数据和预期结果作为格式化文本发布,以便我们都可以阅读并在需要时复制和粘贴。

标签: sql sql-server pivot pivot-table


【解决方案1】:
--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

【讨论】:

  • 我能知道如何将查询转换为字符串查询 (SQL = "") 以在 asp.net 页面中使用。我对 SQL 还比较陌生,所以我不确定如何实现。
  • 您可以创建存储过程并在代码中使用所需参数(例如已在查询中硬编码的月份/年份的开始和结束范围,即 202001、202012)调用它
猜你喜欢
  • 1970-01-01
  • 2015-02-25
  • 2018-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
相关资源
最近更新 更多