将一列中的值拆分为2列

JJu*_*ior 2 sql database sql-server pivot sql-server-2008

我需要在sql中执行以下操作.

表格1:

Year  Client Investment

1999   X     100

1999   Y     200

2000   X     1000

2000   Y     2000
Run Code Online (Sandbox Code Playgroud)

我想以下面的格式显示我的报告:

Client 1999Year   2000Year 

X      100         1000
Run Code Online (Sandbox Code Playgroud)

知道怎么做以上吗?我正在使用sql server 2008

请帮忙.

Tar*_*ryn 6

这种类型的数据转换是已知的a PIVOT.某些数据库产品具有将数据从行转换为列的功能.

您可以CASE在任何数据库中使用带有表达式的聚合函数:

select client,
  sum(case when year = 1999 then investment end) Year_1999,
  sum(case when year = 2000 then investment end) Year_2000
from yourtable
group by client
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo

由于您使用的是SQL Server 2008,因此可以使用该PIVOT函数将数据转换为列:

select *
from
(
  select client, 
    'Year_'+cast(year as varchar(4)) year, 
    investment
  from yourtable
) src
pivot
(
  sum(investment)
  for year in (Year_1999, Year_2000)
) piv
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo.

如果您具有已知数量的year值,则其他查询将很有效,但如果您有未知数字,那么您将需要使用动态SQL:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Year_'+cast(year as varchar(4))) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT client,' + @cols + ' from 
             (
                select client, 
                  ''Year_''+cast(year as varchar(4)) year, 
                  investment
                from yourtable
            ) x
            pivot 
            (
                sum(investment)
                for year in (' + @cols + ')
            ) p '

execute(@query)
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo.

这也可以通过多次加入表来完成:

select t1.client,
  t1.investment Year_1999,
  t2.investment Year_2000
from yourtable t1
left join yourtable t2
  on t1.client = t2.client
  and t2.year = 2000
where t1.year = 1999
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo

所有查询都给出结果:

| CLIENT | YEAR_1999 | YEAR_2000 |
----------------------------------
|      X |       100 |      1000 |
|      Y |       200 |      2000 |
Run Code Online (Sandbox Code Playgroud)