2013-06-19 3 views
3

Мне нужно показать несколько доходов, тип дохода и значения имени работодателя для одного человека в одной строке. Таким образом, если «А» имеет три различных доходы от трех различных источников,Отображать несколько строк и значений столбцов в одну строку, значения нескольких столбцов

id | Name | Employer  | IncomeType  | Amount 

123 | XYZ | ABC.Inc  | EarningsformJob | $200.00 

123 | XYZ | Self   | Self Employment | $300.00 

123 | XYZ. | ChildSupport| Support   | $500.00 

Мне нужно, чтобы показать им, как

id | Name | Employer1 | Incometype1| Amount1 | Employer2 | incometype2 | Amount2| Employer3 | Incometype3| Amount3..... 

123 |XYZ | ABC.Inc |EarningsformJob | $200.00|Self | Self Employment | $300.00|ChildSupport| Support | $500.00..... 

мне нужно как «фиксированное количество столбцов» (где мы знаем, сколько временные работодатели, incometype и количества colums будут повторяться) логика и «динамическое отображение столбцов» (неизвестное количество раз, когда эти столбцы будут повторяться)

Спасибо.

+0

Я думаю, вы могли бы сделать нам немного больше информации здесь, как и любые исходные удары при решении проблемы. Я также хотел бы, чтобы вы отметили это с помощью РСУБД, которую вы используете, поскольку этот код может быть очень специфичным для двигателя. –

+0

Попытка создания отчета на сервере Sql для клиента. – user2501777

+0

Возможный дубликат [Несколько значений столбцов в одной строке] (http://stackoverflow.com/questions/14619186/multiple-column-values-in-a-single-row) –

ответ

10

Поскольку вы используете 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 | 
+0

Спасибо, голубой. Это сработало. ценю вашу помощь. – user2501777

+0

Привет @bluefeet. Я использовал метод, которым вы поделились. Я столкнулся с проблемой, которую я разместил здесь. Вы можете помочь? http://stackoverflow.com/questions/28214838/using-pivoting-in-sql-server-error –

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