制作一个简单的SQL枢轴

时间:2018-06-14 10:58:39

标签: sql sql-server sql-server-2012 pivot-table

Example Image here

MSSQL数据库

我看过许多不同的SQL Pivots,但它们看起来很复杂!

我有一个查询,我只是想在日期上转动

以便DATE位于顶部

并且其他列都在旁边。

SELECT TOP (1000) [date]
  ,[Total Orders]
  ,[Orders Done]
  ,[Pieces picked]
  ,[Items Picked]
  ,[Average Items on Order]
  ,[Picked Today]

  FROM [Cass_SSRS_DailyMiTable]

这是查询,但我正在努力做我需要做的事情....

非常感谢任何帮助

目前日期格式为

 date | total orders |   orders done  |   items picked    |    average items

我希望它像这样

                         24/03/2017        25/03/2017       26/03/2017
Total Orders                53                  351              35
Pieces picked               352                 23               55
items picked                 33                 235              25
average items on order      22                   52              95
picked today

1 个答案:

答案 0 :(得分:1)

您可以按照此基本示例进行操作。

;WITH PreUnpivot AS
(
    SELECT
        date, 
        [Total Orders], 
        [Orders Done], 
        [Items Picked], 
        [Picked Today]
        -- Include other columns you want to display here
    FROM
        Cass_SSRS_DailyMiTable AS C
)
SELECT
    T.*
FROM
    PreUnpivot AS C
    UNPIVOT (
        PivotedValues FOR Concept IN ([Total Orders], [Orders Done], [Items Picked], [Picked Today])
    ) AS T

编辑:您需要在取消投放后进行动态调整(按日期)。

IF OBJECT_ID('tempdb..#Cass_SSRS_DailyMiTable') IS NOT NULL
    DROP TABLE #Cass_SSRS_DailyMiTable

CREATE TABLE #Cass_SSRS_DailyMiTable (
    [date] DATE
  ,[Total Orders] INT
  ,[Orders Done] INT
  ,[Pieces picked] INT
  ,[Items Picked] INT
  ,[Average Items on Order] INT
  ,[Picked Today] INT)

INSERT INTO #Cass_SSRS_DailyMiTable (
    date,
    [Total Orders],
    [Pieces picked],
    [Items Picked],
    [Average Items on Order],
    [Picked Today])
VALUES
    ('2017-03-24', 53, 352, 33, 22, 0),
    ('2017-03-25', 351, 23, 235, 52, 0),
    ('2017-03-26', 35, 55, 25, 95, 0)


DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT ',' + QUOTENAME(CONVERT(VARCHAR(100), c.date, 120)) 
            FROM #Cass_SSRS_DailyMiTable c
            ORDER BY c.date ASC
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 

    ';WITH PreUnpivot AS
    (
        SELECT
            C.date, 
            C.[Total Orders],
            C.[Pieces picked],
            C.[Items Picked],
            C.[Average Items on Order],
            C.[Picked Today]
        FROM
            #Cass_SSRS_DailyMiTable AS C
    )
    SELECT
        P.Concept,
        ' + @cols + '
    FROM
        PreUnpivot AS C
        UNPIVOT (
            PivotedValues FOR Concept IN ([Total Orders], [Pieces picked], [Items Picked], [Average Items on Order], [Picked Today])
        ) AS T
        PIVOT (
            MAX(T.PivotedValues) FOR T.Date IN (' + @cols + ')
        ) AS P'


EXEC (@query)

因为最终作为列的日期是动态的,所以没有动态SQL的转义。如果您希望显示更少的日期,请使用正确的SET @cols = ...子句在WHERE上过滤它们。