gpt4 book ai didi

sql - 在 SQL Server 2008 中按出现次数透视

转载 作者:行者123 更新时间:2023-12-04 05:59:20 25 4
gpt4 key购买 nike

我有如下数据:

enter image description here

我想旋转数据看起来像这样。每个尺寸最多有三个 oPack 值,我希望 Category + Category2 + Size 的每个组合的所有 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

最佳答案

这正是您要寻找的。首先,准备一个小 table 。

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;

关于sql - 在 SQL Server 2008 中按出现次数透视,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9117235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com