Команда SQL Pivot - PullRequest
       10

Команда SQL Pivot

5 голосов
/ 08 сентября 2011

Мне нужна помощь в проектировании простого центра, чтобы я мог связать его с другими частями моих запросов.

Мои данные похожи на это

Таблица элементов

Ниже приведена таблица, если я запускаю Select * from items

ITEM      Weight    
12345         10    
12345         11    
654321        50    
654321        20    
654321       100

В этой таблице сотни предметов, но каждый код товара будет иметь только 3 записи веса каждый.

Я хочу желаемый выводitem.

Спасибо

Обновление

Ниже приводится то, что я использовал до сих пор,

SELECT r.*
FROM   (SELECT 'weight' + CAST(Row_number() OVER (ORDER BY regtime ASC)AS
                               VARCHAR(10))
                      line,
               id,
               weight
        FROM   items it) AS o PIVOT(MIN([weight]) FOR line IN (weight1, weight2,
       weight3)) AS r  

Ответы [ 3 ]

2 голосов
/ 08 сентября 2011

Вы были почти там!Вы пропустили только условие PARTITION BY в OVER:

SELECT r.*
FROM   (SELECT 'weight' + CAST(Row_number() OVER (PARTITION BY id ORDER BY
                               regtime ASC)
                                      AS
                                              VARCHAR(10)) line,
               id,
               weight
        FROM   items it) AS o PIVOT(MIN([weight]) FOR line IN (weight1, weight2,
       weight3)) AS r  

Когда вы PARTITION BY по идентификатору, номера строк сбрасываются для каждого отдельного идентификатора.

Обновление

Вам не нужен динамический круг, так как у вас всегда будет 3 веса.Но, если вам когда-нибудь понадобится динамическое число столбцов, взгляните на некоторые примеры здесь:

1 голос
/ 08 сентября 2011

Вам понадобится значение для формирования столбцов, которые я делаю с row_number. Результат - то, что вы хотите. Единственный минус, который я имею против PIVOT, это то, что вам нужно знать, сколько столбцов заранее. Я использую аналогичный метод, но создаю select как динамический SQL и затем могу вставить мои столбцы.

РЕДАКТИРОВАТЬ: обновлено, чтобы отображать столбцы как вес1, вес2 и т. Д.

create table #temp (Item int, Weight int)

insert into #temp (Item, Weight) 
Values (12345, 10),
       (12345, 11),
       (654321, 50),
       (654321, 20),
       (654321, 200)

SELECT *
  FROM (SELECT Item,
               Weight,
               'weight' + cast(Row_number() 
                          OVER (partition by Item order by item) as varchar(10)) as seq
          FROM #temp) as Src 
        PIVOT (  MAX(Weight) FOR Seq IN ([Weight1], [Weight2], [Weight3])  ) as PVT
0 голосов
/ 08 сентября 2011

MySQL
Всякий раз, когда вам нужен сводный элемент, используйте group_concat, и он выведет список значений CSV, который вам нужен.
Как только вы привыкнете работать с ним, это отличныйинструмент.

SELECT item, GROUP_CONCAT(weight) as weights FROM table1
GROUP BY item

См .: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

TSQL или SQL-сервер
Много вопросов по этому поводу, поскольку T-SQL поддерживает ключевое слово pivot.

См .:
Transact SQL Query-Pivot-SQL
Сводные данные в T-SQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...