2013-03-18 4 views
2

SQL에서 다음을 수행해야합니다.한 열에서 두 열로 값 나누기

표 1 :

내 보고서 형식으로 아래를에 표시 할
Year Client Investment 

1999 X  100 

1999 Y  200 

2000 X  1000 

2000 Y  2000 

:

Client 1999Year 2000Year 

X  100   1000 

어떤 생각을 어떻게 위의 작업을 수행하는 방법? SQL Server 2008을 사용 중입니다.

도와주세요.

답변

3

여러 가지 가능한 해결책이 있습니다. 하나는 MAX()CASE을 사용하는 것

SELECT Client, 
     MAX(CASE WHEN YEAR = 1999 THEN Investment END) [1999Year], 
     MAX(CASE WHEN YEAR = 2000 THEN Investment END) [2000Year] 
FROM TableName 
WHERE Client = 'X' 
GROUP BY Client 

또는 사용 PIVOT 기능

SELECT Client, 
     [1999] AS [1999YEAR], 
     [2000] AS [2000YEAR] 
FROM 
(
    SELECT YEAR, CLient, Investment 
    FROM TableName 
    WHERE Client = 'X' 
) pvt 
PIVOT 
(
    MAX(InvestMent) 
    FOR YEAR IN ([1999],[2000]) 
) s 
+1

일을 PIVOT''에 대한. – rbedger

+1

감사합니다! 그 작품 : – JJunior

+0

그걸 듣게되어 기쁘다 .. –

6

이 유형의 데이터 변환은 PIVOT으로 알려져 있습니다. 일부 데이터베이스 제품에는 데이터를 행에서 열로 변환하는 기능이 있습니다. 당신이로 데이터를 변환 할 수 PIVOT 기능을 사용할 수 있습니다, 당신은 SQL Server 2008을 사용하고 있기 때문에

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 

SQL Fiddle with Demo

를 참조하십시오

당신은 어떤 데이터베이스에 CASE 표현으로 집계 함수를 사용할 수 있습니다 열 :

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 

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) 

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 

SQL Fiddle with Demo

모든 쿼리 결과를 제공 참조 :

| CLIENT | YEAR_1999 | YEAR_2000 | 
---------------------------------- 
|  X |  100 |  1000 | 
|  Y |  200 |  2000 | 
관련 문제