SQL, несколько строк в один столбец

Итак, у меня есть следующая дата

ID       NAME       MONTH              COUNT

1        David      December2012       500

2        Rob        December2012       320

1        David      January2013        400

2        Rob        January2013        280

Я пытаюсь сделать это .......

ID       Name       December2012       January2013

1        David      500                400

2        Rob        320                280

Там, где я запутался, я хочу сохранить два столбца и просто развернуть два других поля. Кто-нибудь знает, как я это сделаю.

Большое вам спасибо за вашу помощь/время. Я никогда не размещал ни одного из них, и ответы очень ценятся!

1
nl ja de
Какие СУБД вы используете?
добавлено автор Mahmoud Gamal, источник
добавлено автор Hamlet Hakobyan, источник

2 ответы

Вы не указали, какие RDBMS вы используете. Вы можете сворачивать данные во всех базах данных с помощью агрегатной функции с выражением CASE :

select id, name, 
  sum(case when month = 'December2012' then "count" end) December2012,
  sum(case when month = 'January2013' then "count" end) January2013
from yourtable
group by id, name

See SQL Fiddle with Demo

Если вы используете SQL Server 2005+ или Oracle 11g, вы можете использовать функцию PIVOT :

select *
from
(
  select id, name, month, [count]
  from yourtable
) src
pivot
(
  sum([count])
  for month in (December2012, January2013)
) piv

См. SQL Fiddle with Demo .

В SQL Server, если значения month неизвестны, вы можете использовать динамический SQL, похожий на этот:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(month) 
                    from yourtable
            FOR xml PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT id, name,' + @cols + ' from 
             (
                select id, name, month, [count]
                from yourtable
            ) x
            pivot 
            (
                sum([count])
                for month in (' + @cols + ')
            ) p '

execute(@query)

See SQL Fiddle with Demo

Все версии дают результат:

| ID |  NAME | DECEMBER2012 | JANUARY2013 |
-------------------------------------------
|  1 | David |          500 |         400 |
|  2 |   Rob |          320 |         280 |
5
добавлено
@ user2051103, как правило, когда вы получаете несколько ответов на свой вопрос, нормальный ответ заключается в том, чтобы принять ответ, опубликованный первым. В этом случае мой ответ был опубликован первым.
добавлено автор Taryn, источник
@ user2051103 Этот ответ был опубликован первым. Примите этот ответ.
добавлено автор Kermit, источник
Это работает! Спасибо. Сначала я не был уверен, почему вы включали СУММ, так как я не добавлял ничего с одной строкой в ​​месяц на человека. Но потом я заметил, что у меня были нули, когда я его вынул, и несколько записей привели к тому, что они должны были быть включены в группу. У меня есть еще один вопрос по этому вопросу, который я пытаюсь выполнить. Я отправлю для этого другой поток, но хочу вас поднять. Я использую SQL Server Management Studio 2008. Я очень новичок в этом, изучая, как я иду. Благодаря!
добавлено автор user2051103, источник

Поскольку вы не указали, какую RDBMS вы используете, вы можете сделать это:

SELECT
  ID,
  NAME,
  MAX(CASE WHEN MONTH = 'December2012' THEN "COUNT" END) AS "December2012",
  MAX(CASE WHEN MONTH = 'January2013'  THEN "COUNT" END) AS "January2013"
FROM Tablename
GROUP BY ID, Name;
0
добавлено
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)