2012-02-02 89 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