在 SQL Server 2008 中按出现次数进行透视

发布于 01-02 02:30 字数 785 浏览 2 评论 0原文

我有如下数据:

在此处输入图像描述

我想将数据旋转为如下所示。每个尺寸最多有 3 个 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

I have data like the following:

enter image description here

I want to pivot the data to look like this. There are a maximum of three oPack values per Size, and I'd like all the oPack values for each combination of Category + Category2 + Size to be listed in increasing order in the last 3 columns.

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

I tried something like :

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

千年*琉璃梦2025-01-09 02:30:58

这正是您正在寻找的东西。首先,做一些餐桌准备。

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;

This gives exactly what you're looking for. First, a little table preparation.

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);

Then, your solution:

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;

And, an alternate solution that could be useful:

SELECT
   *
FROM
   #Drinks
   PIVOT (Max(Pack) FOR Pack IN (
      [250], [355], [400], [1000], [1400], [1600],
      [1750], [1890], [2630], [2840], [3780]
   )) P;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文