Sql server SQL Server透视多个值

Sql server SQL Server透视多个值,sql-server,pivot,Sql Server,Pivot,使用SQL Server 2012 我有下表。样式和颜色作为参数传递: Style Colour Size Whse Stock Sales 4WeekSales ATP ABC123 AS12 10 London 2 3 6 7 ABC123 AS12 12 London 4 6 8 10

使用SQL Server 2012

我有下表。样式和颜色作为参数传递:

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;
然而,这是可行的,但仅以库存为中心-我如何通过销售\4WeekSales\ATP以及whse的B组来实现中心

先谢谢你

这是我的最新代码。如果我取下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

我能找到的最接近你的就是这个

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

非常感谢,数据看起来更好。我已经试过了,但仔细检查后,数据会被放在每种whse的每种尺寸的新行上。我需要的数量都在一排的whse。有什么想法吗?应该给你每一行whse/类型如果你不想列出的类型,你只需要将它从列表中删除select@Michael下面是这个示例的一个sql脚本。。谢谢,但仍然不正确-它仍然为每个尺码创建了一个新行,非常感谢,数据看起来更好。我尝试过这个方法,但仔细检查后,每个whse的每个尺码的数据都会放在一个新行上。我需要的数量都在一排的whse。有什么想法吗?应该给你每一行whse/类型如果你不想列出的类型,你只需要将它从列表中删除select@Michael下面是这个示例的一个sql脚本。。谢谢,但仍然不正确-它仍然为每个尺寸创建一个新行