2013-09-06 4 views
1

У меня есть следующие таблицы и данные:Строки SQL Server для Multi-столбцов

CREATE TABLE SourceTbl ([Code] varchar(3), [Total] decimal, [Date] datetime); 

INSERT INTO SourceTbl ([Code], [Total], [Date]) 
VALUES ('AA', 100, '2012-12-01'), ('AA', 200, '2013-02-01'), ('BB', 50, '2012-01-01'); 

Простой выбор будет возвращать

Code | Total | Date 
'AA' | 100 | 2012-12-01 
'AA' | 200 | 2013-02-01 
'BB' | 50 | 2012-01-01 

, но то, что мне нужно, это следующие

Code | Total | Date  | Total | Date 
'AA | 200 | 2013-02-01 | 100 | 2012-12-01 
'BB | 50 | 2012-01-01 | null | null 

Я пытался сделать это с помощью оператора PIVOT, но безуспешно (на основе вопроса SQL Server Pivot multiple columns based on one column).

Используя этот пример, все, что я получаю, это две строки с нулевыми значениями.

Столбцы Total/Date могут быть повторены 13 раз, и их необходимо заказывать по дате DESC.

SQL Скрипки: http://sqlfiddle.com/#!3/f37a1/2

Любая помощь приветствуется! Спасибо!

+0

'PIVOT' +' row_number() 'в спасение , –

ответ

2

Если вам нужно только две колонки:

with cte as (
    select *, row_number() over(partition by Code order by Date) as rn 
    from SourceTbl 
) 
select 
    code, 
    max(case when rn = 1 then Total end) as Total1, 
    max(case when rn = 1 then Date end) as Date1, 
    max(case when rn = 2 then Total end) as Total2, 
    max(case when rn = 2 then Date end) as Date2 
from cte 
group by code 

=> sql fiddle demo

динамическое решение:

declare @stmt nvarchar(max) 

;with cte as (
    select distinct 
     cast(row_number() over(partition by Code order by Date) as nvarchar(max)) as rn 
    from SourceTbl 
) 
select @stmt = isnull(@stmt + ', ', '') + 
    'max(case when rn = ' + rn + ' then Total end) as Total' + rn + ',' + 
    'max(case when rn = ' + rn + ' then Date end) as Date' + rn 
from cte 
order by rn 

select @stmt = ' 
    with cte as (
     select *, row_number() over(partition by Code order by Date) as rn 
     from SourceTbl 
    ) 
    select 
     code, ' + @stmt + ' from cte group by code' 

exec sp_executesql 
    @stmt = @stmt 

=> sql fiddle demo

+1

Удивительная работа! Никогда не знал, что вы можете динамически добавлять столбцы. – user2600629

+0

То, что мне нужно! Спасибо! –

0

Вы пытаетесь динамически создавать столбцы в своем результирующем наборе?

Если у вас была третья запись «AA» с 300 и датой 03/01/2013, значит, вы хотели бы, чтобы что-то подобное отображалось?

Code | Total | Date  | Total | Date  | Total | Date 
AA | 200 | 2013-02-01 | 100 | 2012-12-01| 300 | 03-01-13 
BB | 50 | 2012-01-01 | null | null  | null | null   
+1

Это должен быть комментарий, а не ответ – Sonam

+0

Да, у меня может быть до 13 общих комбинаций/дат. –

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