Поскольку вы используете SQL Server, существует несколько способов переноса строк данных в столбцы.
Совокупная функция/CASE: Вы можете использовать агрегатную функцию с выражением CASE вместе с row_number()
. Эта версия требует, чтобы у вас есть известное число значений становятся столбцами:
select id,
name,
max(case when rn = 1 then employer end) employer1,
max(case when rn = 1 then IncomeType end) IncomeType1,
max(case when rn = 1 then Amount end) Amount1,
max(case when rn = 2 then employer end) employer2,
max(case when rn = 2 then IncomeType end) IncomeType2,
max(case when rn = 2 then Amount end) Amount2,
max(case when rn = 3 then employer end) employer3,
max(case when rn = 3 then IncomeType end) IncomeType3,
max(case when rn = 3 then Amount end) Amount3
from
(
select id, name, employer, incometype, amount,
row_number() over(partition by id order by employer) rn
from yourtable
) src
group by id, name;
См SQL Fiddle with Demo.
PIVOT/UNPIVOT: Вы можете использовать функции UNPIVOT и PIVOT для получения результата. UNPIVOT преобразует ваши несколько столбцов в Employer
, IncomeType
и Amount
в краткие строки перед применением точки опоры. Ты не специфичны, какая версия SQL Server, если у вас есть известное число значений, то вы можете использовать следующие в SQL Server 2005+, который использует CROSS ОТНОСИТЬСЯ с UNION ALL для UNPIVOT:
select id, name,
employer1, incometype1, amount1,
employer2, incometype2, amount2,
employer3, incometype3, amount3
from
(
select id, name, col+cast(rn as varchar(10)) col, value
from
(
select id, name, employer, incometype, amount,
row_number() over(partition by id order by employer) rn
from yourtable
) t
cross apply
(
select 'employer', employer union all
select 'incometype', incometype union all
select 'amount', cast(amount as varchar(50))
) c (col, value)
) src
pivot
(
max(value)
for col in (employer1, incometype1, amount1,
employer2, incometype2, amount2,
employer3, incometype3, amount3)
) piv;
См SQL Fiddle with Demo.
Dynamic Version: Наконец, если у вас есть неизвестное количество значений, вам нужно будет использовать динамический SQL для генерации результата.
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(col+cast(rn as varchar(10)))
from
(
select row_number() over(partition by id order by employer) rn
from yourtable
) d
cross apply
(
select 'employer', 1 union all
select 'incometype', 2 union all
select 'amount', 3
) c (col, so)
group by col, rn, so
order by rn, so
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT id, name,' + @cols + '
from
(
select id, name, col+cast(rn as varchar(10)) col, value
from
(
select id, name, employer, incometype, amount,
row_number() over(partition by id order by employer) rn
from yourtable
) t
cross apply
(
select ''employer'', employer union all
select ''incometype'', incometype union all
select ''amount'', cast(amount as varchar(50))
) c (col, value)
) x
pivot
(
max(value)
for col in (' + @cols + ')
) p '
execute(@query);
См. SQL Fiddle with Demo. Все версии дают результат:
| ID | NAME | EMPLOYER1 | INCOMETYPE1 | AMOUNT1 | EMPLOYER2 | INCOMETYPE2 | AMOUNT2 | EMPLOYER3 | INCOMETYPE3 | AMOUNT3 |
-------------------------------------------------------------------------------------------------------------------------------------
| 123 | XYZ | ABC.Inc | EarningsformJob | 200 | ChildSupport | Support | 500 | Self | Self Employment | 300 |
Я думаю, вы могли бы сделать нам немного больше информации здесь, как и любые исходные удары при решении проблемы. Я также хотел бы, чтобы вы отметили это с помощью РСУБД, которую вы используете, поскольку этот код может быть очень специфичным для двигателя. –
Попытка создания отчета на сервере Sql для клиента. – user2501777
Возможный дубликат [Несколько значений столбцов в одной строке] (http://stackoverflow.com/questions/14619186/multiple-column-values-in-a-single-row) –