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
答案 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
上过滤它们。