2012-02-02 48 views
2

我有数据,如下列:透视依据出现次数在SQL Server 2008

enter image description here

我想透视数据,看起来像这样。每个尺寸最多有三个oPack值,并且我希望每个“类别+类别2 +尺寸”组合的所有oPack值在最后3列中按升序排列。

Category | Category2 | Size  | Pack1 | Pack2 | Pack3 
Chilled... Chilled  1.75-1.89L 1750 1890 NULL 
Chilled... Chilled  1.75/1.89L 1750 1890 NULL 
Chilled... Chilled  1.75L  1750 NULL NULL 
Chilled... Chilled  1.89/2.63L 1890 2630 NULL 
... 
Chilled... Chilled  400-710mL 400  NULL NULL 

我想是这样的:

select [Category],[Category2], [Pack1], [Pack2], [Pack3] 
from (
    select [Category],[Category2],[size], oPack 
    from myTable) p 
pivot (Max(oPack) for oPack in ([Pack1], [Pack2], [Pack3])) as pvt 
+0

这是没有意义的,你是隐式分组枢轴一些属性,你分组的属性是什么?从你的示例数据和结果我不能告诉 – 2012-02-02 17:55:49

+0

请提供更好的样本数据和结果,并更好地描述你正在尝试做什么 – 2012-02-02 17:59:06

+0

不知道我怎样才能使它更明显 - 对于具有相同类别的每组行,类别2和大小值,我想要进行转换,以便将独特的oPack值分成3列。 – Perplexed 2012-02-02 18:30:31

回答

3

这使正是你要寻找的。首先,一个小桌子的准备。

IF object_id('tempdb.dbo.#Drinks') IS NOT NULL DROP TABLE #Drinks; 
GO 
CREATE TABLE #Drinks (
    Category1 varchar(40), 
    Category2 varchar(40), 
    Size varchar(20), 
    Pack int 
); 

INSERT #Drinks VALUES 
    ('Chilled Juices & Drinks', 'Chilled', '1.75-1.89L', 1750), 
    ('Chilled Juices & Drinks', 'Chilled', '1.75-1.89L', 1890), 
    ('Chilled Juices & Drinks', 'Chilled', '1.75/1.89L', 1750), 
    ('Chilled Juices & Drinks', 'Chilled', '1.75/1.89L', 1890), 
    ('Chilled Juices & Drinks', 'Chilled', '1.75', 1750), 
    ('Chilled Juices & Drinks', 'Chilled', '1.89/2.63L', 1890), 
    ('Chilled Juices & Drinks', 'Chilled', '1.89/2.63L', 2630), 
    ('Chilled Juices & Drinks', 'Chilled', '1.89L', 1890), 
    ('Chilled Juices & Drinks', 'Chilled', '1L', 1000), 
    ('Chilled Juices & Drinks', 'Chilled', '1L', 1000), 
    ('Chilled Juices & Drinks', 'Chilled', '2.63L', 2630), 
    ('Chilled Juices & Drinks', 'Chilled', '2.84L', 2840), 
    ('Chilled Juices & Drinks', 'Chilled', '250mL', 250), 
    ('Chilled Juices & Drinks', 'Chilled', '3.78L', 3780), 
    ('Chilled Juices & Drinks', 'Chilled', '355mL', 355), 
    ('Chilled Juices & Drinks', 'Chilled', '400-710mL', 400), 
    ('Frozen Juices', 'Frozen', '1.60L', 1600), 
    ('Frozen Juices', 'Frozen', '1.40L', 1400); 

然后,你的解决方案:

WITH Nums AS (
    SELECT 
     *, 
     'Pack' + Convert(varchar(30), Dense_Rank() OVER (
     PARTITION BY Category1, Category2, Size ORDER BY Pack) 
     ) PackNum 
    FROM #Drinks 
) 
SELECT 
    * 
FROM 
    Nums 
    PIVOT (Max(Pack) FOR PackNum IN (Pack1, Pack2, Pack3)) P; 

而且,一个替代的解决方案可能是有用的:

SELECT 
    * 
FROM 
    #Drinks 
    PIVOT (Max(Pack) FOR Pack IN (
     [250], [355], [400], [1000], [1400], [1600], 
     [1750], [1890], [2630], [2840], [3780] 
    )) P; 
+0

谢谢你的继续努力.Hi ErikE,你的解决方案看起来很接近,但是不同的包装在他们自己的单独的行上,即。类别+ category2 +尺寸的3个不同包装应位于同一行。 – Perplexed 2012-02-03 20:21:19

+0

@Perplexed你能举个例子吗?我无法找到相同类别+类别2 +大小的3个包,以至于我的查询不会放在同一行上...您会添加更多示例数据还是更多示例输出行来澄清区别? – ErikE 2012-02-03 20:26:26

+0

oK,使用您的示例表,它的工作原理非常棒 - 但不适合我的桌子。主键列是否会影响数据透视表?啊哈!它确实 - :)非常感谢它的工作! – Perplexed 2012-02-03 20:27:54