2012-08-02 2 views
1

SQL Server 2008 데이터베이스에서 작업하고 있습니다.값을 선택하고 시리즈로 그룹화하는 Sql 쿼리

나는? 값을 선택하고 다음과 같이 그들을 반환 할 수 쿼리가 있습니까

Year a  b  c 
------+------+--------+------ 
1990 1.5 1.6  1.7 
1991 1.8 1.9  2.5 

감사합니다 어떤 도움을 많이이 "

Id  Year Series Value 
----+------+--------+------ 
1  1990 a  1.5 
1  1990 b  1.6 
1  1990 c  1.7 
1  1991 a  1.8 
1  1991 b  1.9 
1  1991 c  2.5 

같은 테이블이 있습니다.

+1

는 (A, B 시리즈의 값입니다 , c) 고정 된 세트 또는 '시리즈'가 추가 값을 가질 수 있습니까? –

+0

다른 시리즈가 있을지 모르지만 나는 a, b 및 c에만 관심이 있습니다. 그렇기 때문에 우리는 고정 된 것으로 간주 할 수 있습니다. – Youssef

+0

다음 이반 G는 답을 가지고 있습니다. –

답변

3

시리즈가 a, b, c에 고정되어 있다면 다음과 같이 할 수 있습니다 :

CREATE TABLE #t (Id INT, Year INT, 
    Series VARCHAR(5), Value DECIMAL(10,1)) 
INSERT #t 
VALUES 
(1,  1990, 'a',  1.5), 
(1,  1990, 'b',  1.6), 
(1,  1990, 'c',  1.7), 
(1,  1991, 'a',  1.8), 
(1,  1991, 'b',  1.9), 
(1,  1991, 'c',  2.5) 

SELECT pvt.Year, 
     pvt.a, 
     pvt.b, 
     pvt.c 
FROM #t 
PIVOT (
    MIN(Value) FOR Series IN ([a], [b], [c]) 
) pvt 
012 다른 값이 될 경우 3,516,

동적 피벗 사용할 수 있습니다 : 고정 된 시리즈 시나리오에서

DECLARE @series VARCHAR(100) = 
    STUFF((SELECT DISTINCT ',[' + Series + ']' 
      FROM #t 
      FOR  XML PATH('')) 
      ,1, 1, '') 

DECLARE @query VARCHAR(2000) = ' 
SELECT pvt.Year, ' + @series +' 
FROM #t 
PIVOT (
    MIN(Value) FOR Series IN (' + @series + ') 
) pvt 
'; 

EXEC(@query) 

을, CROSS와 가능성 가입도있다 :

SELECT a.Year, 
     MAX(CASE WHEN a.Series = 'a' THEN a.Value END) a, 
     MAX(CASE WHEN a.Series = 'b' THEN a.Value END) b, 
     MAX(CASE WHEN a.Series = 'c' THEN a.Value END) c 
FROM #t a 
CROSS JOIN #t b 
GROUP BY a.Id, a.Year 
ORDER BY a.Year 
관련 문제