2013-02-07 9 views
1

Поэтому у меня есть следующая дата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 

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

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

+2

Какие СУБД вы используете? –

+1

[Что вы пробовали?] (Http://whathaveyoutried.com) –

ответ

0

Поскольку вы не указали, какие 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; 
5

Вы не указали, какие РСУБД вы используете. Вы можете поворота данных во всех базах данных с использованием агрегатной функции с 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 

См 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) 

См SQL Fiddle with Demo

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

| ID | NAME | DECEMBER2012 | JANUARY2013 | 
------------------------------------------- 
| 1 | David |   500 |   400 | 
| 2 | Rob |   320 |   280 | 
+0

Это работало! Спасибо. Сначала я не был уверен, почему вы включали СУММ, так как я не добавлял ничего с одной строкой в ​​месяц на человека. Но потом я заметил, что у меня были нули, когда я его вынул, и несколько записей привели к тому, что они должны были быть включены в группу. У меня есть еще один вопрос по этому вопросу, который я пытаюсь выполнить. Я отправлю для этого другой поток, но хочу вас поднять. Я использую SQL Server Management Studio 2008. Я очень новичок в этом, изучая, как я иду. Благодаря! – user2051103

+0

@ user2051103 Обычно, когда вы получаете несколько ответов на свой вопрос, нормальный ответ заключается в том, чтобы принять ответ, опубликованный первым. В этом случае мой ответ был опубликован первым. – Taryn

+0

@ user2051103 Этот ответ был опубликован первым. Примите этот ответ. – Kermit

Смежные вопросы