SQL 服务器透视多个值
SQL Server Pivot Multiple Values
使用 SQL Server 2012。
我有以下 table。样式和颜色作为参数传递:
Style Colour Size Whse Stock Sales 4WeekSales ATP
ABC123 AS12 10 London 2 3 6 7
ABC123 AS12 12 London 4 6 8 10
ABC123 AS12 14 New York 6 8 9 12
ABC123 AS12 10 New York 7 5 7 5
但需要数据看起来像这样,顶部的尺寸:
Whse 10 12 14
Lon
Stock 2 4 6
Sales 3 6 8
4WeekSales 6 8 9
ATP 7 10 12
New York
Stock 7 6
Sales 5 8
4WeekSales 7 9
ATP 5 12
注意点 - 大小字段需要动态 - 有时可以是 6 /8/10/12,有时可以是 XS/S/M/L 等
他们还有两个以上的 whse - 这只是一个例子。
我确实在 T-SQL:
开始了
use SafetyStock
go
DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += N', p.' + QUOTENAME(Size)
FROM (SELECT p.Size FROM dbo.vw_optimums AS p
GROUP BY p.Size) AS x;
SET @sql = N'
SELECT SKU, Style,' + STUFF(@columns, 1, 2, '') + '
FROM
(
SELECT SKU, Style, p.Size, p.SAFETYSTOCK
FROM dbo.vw_optimums AS p
) AS j
PIVOT
(
SUM(SAFETYSTOCK) FOR Size IN ('
+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')
+ ')
) AS p;';
PRINT @sql;
EXEC sp_executesql @sql;
然而,这有效但仅以股票为中心 - 我如何同时以 SalesWeekSales\ATP 为中心并以 whse 为基点?
提前致谢。
这是我最新的代码。如果我把 SEQNO 拿出来,它就可以工作,但我需要这个,这样尺寸才能正确地显示在顶部,例如S / M / L / XL / XXL 等或 6/ 8 / 10 / 12
DECLARE @SizeColums VARCHAR(MAX)
DECLARE @Seq Integer
SELECT
@SizeColums = COALESCE(@SizeColums + ',','') + QUOTENAME([Size]),
@Seq = SEQNO
FROM vw_optimums1
GROUP BY [Size],[SEQNO]
ORDER BY [SEQNO]
DECLARE @Sql NVARCHAR(MAX) = N'
SELECT Whse,
[Types],' +
@SizeColums + '
FROM (SELECT * FROM vw_optimums1) t
UNPIVOT (
[Type]
FOR [Types] IN ([Stock],[LWSALES],[L4WSALES],[ATP]) ) up
PIVOT (
MAX([Type])
FOR [Size] IN (' + @SizeColums + ')
) p
'
EXEC sp_executesql @sql;
我能找到的最接近你的是这个。
DECLARE @SizeColums VARCHAR(MAX)
SELECT @SizeColums = COALESCE(@SizeColums + ',','') + QUOTENAME([Size])
FROM vw_optimums
GROUP BY [Size]
DECLARE @Sql NVARCHAR(MAX) = N'
SELECT Whse,
[Types],' +
@SizeColums + '
FROM (SELECT * FROM vw_optimums
) t
UNPIVOT (
[Type]
FOR [Types] IN ([Stock],[Sales],[4WeekSales],[ATP]) ) up
PIVOT (
MAX([Type])
FOR [Size] IN (' + @SizeColums + ')
) p
'
这实际上首先使用 UNPIVOT 按大小进行细分,然后根据大小进行透视。
根据示例数据,您将得到这样的结果。
Whse Types 10 12 14
-------- -------------- ----------- ----------- -----------
London 4WeekSales 6 8
London ATP 7 10
London Sales 3 6
London Stock 2 4
New York 4WeekSales 7 9
New York ATP 5 12
New York Sales 5 8
New York Stock 7 6
使用 SQL Server 2012。
我有以下 table。样式和颜色作为参数传递:
Style Colour Size Whse Stock Sales 4WeekSales ATP
ABC123 AS12 10 London 2 3 6 7
ABC123 AS12 12 London 4 6 8 10
ABC123 AS12 14 New York 6 8 9 12
ABC123 AS12 10 New York 7 5 7 5
但需要数据看起来像这样,顶部的尺寸:
Whse 10 12 14
Lon
Stock 2 4 6
Sales 3 6 8
4WeekSales 6 8 9
ATP 7 10 12
New York
Stock 7 6
Sales 5 8
4WeekSales 7 9
ATP 5 12
注意点 - 大小字段需要动态 - 有时可以是 6 /8/10/12,有时可以是 XS/S/M/L 等
他们还有两个以上的 whse - 这只是一个例子。
我确实在 T-SQL:
开始了use SafetyStock
go
DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += N', p.' + QUOTENAME(Size)
FROM (SELECT p.Size FROM dbo.vw_optimums AS p
GROUP BY p.Size) AS x;
SET @sql = N'
SELECT SKU, Style,' + STUFF(@columns, 1, 2, '') + '
FROM
(
SELECT SKU, Style, p.Size, p.SAFETYSTOCK
FROM dbo.vw_optimums AS p
) AS j
PIVOT
(
SUM(SAFETYSTOCK) FOR Size IN ('
+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')
+ ')
) AS p;';
PRINT @sql;
EXEC sp_executesql @sql;
然而,这有效但仅以股票为中心 - 我如何同时以 SalesWeekSales\ATP 为中心并以 whse 为基点?
提前致谢。
这是我最新的代码。如果我把 SEQNO 拿出来,它就可以工作,但我需要这个,这样尺寸才能正确地显示在顶部,例如S / M / L / XL / XXL 等或 6/ 8 / 10 / 12
DECLARE @SizeColums VARCHAR(MAX)
DECLARE @Seq Integer
SELECT
@SizeColums = COALESCE(@SizeColums + ',','') + QUOTENAME([Size]),
@Seq = SEQNO
FROM vw_optimums1
GROUP BY [Size],[SEQNO]
ORDER BY [SEQNO]
DECLARE @Sql NVARCHAR(MAX) = N'
SELECT Whse,
[Types],' +
@SizeColums + '
FROM (SELECT * FROM vw_optimums1) t
UNPIVOT (
[Type]
FOR [Types] IN ([Stock],[LWSALES],[L4WSALES],[ATP]) ) up
PIVOT (
MAX([Type])
FOR [Size] IN (' + @SizeColums + ')
) p
'
EXEC sp_executesql @sql;
我能找到的最接近你的是这个。
DECLARE @SizeColums VARCHAR(MAX)
SELECT @SizeColums = COALESCE(@SizeColums + ',','') + QUOTENAME([Size])
FROM vw_optimums
GROUP BY [Size]
DECLARE @Sql NVARCHAR(MAX) = N'
SELECT Whse,
[Types],' +
@SizeColums + '
FROM (SELECT * FROM vw_optimums
) t
UNPIVOT (
[Type]
FOR [Types] IN ([Stock],[Sales],[4WeekSales],[ATP]) ) up
PIVOT (
MAX([Type])
FOR [Size] IN (' + @SizeColums + ')
) p
'
这实际上首先使用 UNPIVOT 按大小进行细分,然后根据大小进行透视。
根据示例数据,您将得到这样的结果。
Whse Types 10 12 14
-------- -------------- ----------- ----------- -----------
London 4WeekSales 6 8
London ATP 7 10
London Sales 3 6
London Stock 2 4
New York 4WeekSales 7 9
New York ATP 5 12
New York Sales 5 8
New York Stock 7 6