2016-01-29 3 views
1

Использование SQL Server 2012.SQL Server Pivot Несколько значений

У меня есть следующая таблица. Стиль и цвет передается в качестве параметра:

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 и т. д.

Также их больше двух, это просто пример.

я сделал старт в 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 \ АТФ, а также GroupB на товарный склад?

Заранее спасибо.

Это мой последний код. Если я возьму 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. Мне нужно, чтобы все qty были на одной строке для whse. Есть идеи? – Michael