2016-01-29 81 views
1

使用SQL Server 2012.SQL Server支持多个值

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

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和也由仓库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; 

回答

0

关于最接近我可以给你的就是这个。

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 
+0

好极了,让我检查并回复你... – Michael

+0

非常感谢你,数据看起来更好。 – Michael

+0

我试过这个,但仔细检查数据放在每个大小的每个大小的新行。我需要在一行中的数量全部为whse。有任何想法吗? – Michael