2013-06-19 89 views
3

我必须为单个行中的单个个人显示多个收入,收入类型和雇主名称值。所以,如果“A”有三种不同的来源三个不同的收入,将多个行和列值显示为单行,多列值

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..... 

我既需要“固定的列数”(我们知道多少次数雇主,收入类型和数量colums将重复)逻辑和“列动态显示”(这些列将重复未知次数)

谢谢。

+0

我想你可以在这里给我们更多的信息,就像任何初始刺探解决问题一样。我也确保你用你使用的RDBMS标记这个代码,因为这个代码可能是特定于引擎的 –

+0

尝试在Sql Server中为客户端生成报告。 – 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会将您的多列EmployerIncomeTypeAmount转换为多个行。你没有特定的SQL Server的什么版本,假设你有一个已知的数值,那么你可以使用在使用CROSS与UNION全部应用到逆转置的SQL Server 2005+以下:

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

谢谢bluefeet。这工作。感谢你的帮助。 – user2501777

+0

你好@bluefeet。我使用了你分享的方法。我遇到了我在这里发布的问题。你能帮忙吗? http://stackoverflow.com/questions/28214838/using-pivoting-in-sql-server-error –