Сводка по номеру вхождения в SQL Server 2008 - PullRequest
2 голосов
/ 02 февраля 2012

У меня есть данные, подобные следующим:

enter image description here

Я хочу, чтобы данные выглядели так. Максимальное количество значений oPack - 3, и я бы хотел, чтобы все значения oPack для каждой комбинации категорий + категория2 + размер отображались в порядке возрастания в последних 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

1 Ответ

3 голосов
/ 03 февраля 2012

Это дает именно то, что вы ищете. Сначала небольшая подготовка стола.

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...