2012-08-08 3 views
0

오라클SQL. 가능한가?

select * from table1;

column1 |  column2 | column3 | 
a  |  2010  |  1  | 
a  |  2011  |  2  | 
a  |  2012  |  3  | 
b  |  2010  |  4  | 
b  |  2011  |  5  | 
b  |  2012  |  6  | 
c  |  2010  |  7  | 
c  |  2011  |  8  | 
c  |  2012  |  9  | 

이렇게 할 수 있습니까?

column1 | 2010 | 2011 | 2012 | 
a  |  1  |  2  |  3  | 
b  |  4  |  5  |  6  | 
c  |  7  |  8  |  9  | 
+8

예를 들어, SQL은 가능합니다. – JJJ

+3

어떤 DB를 사용합니까? – Kayser

답변

4

SELECT t.column1, 
     (SELECT SUM(column3) FROM table1 
     WHERE column1 = t.column1 AND column2 = 2010) AS "2010", 
     (SELECT SUM(column3) FROM table1 
     WHERE column1 = t.column1 AND column2 = 2011) AS "2011", 
     (SELECT SUM(column3) FROM table1 
     WHERE column1 = t.column1 AND column2 = 2012) AS "2012" 
FROM (
    SELECT DISTINCT column1 FROM table1 
) t 
ORDER BY t.column1 

주, 나는 SUM() 집계 함수 주위 colum3 경우에 당신이 column1, column2 당 중복 값을 가질 수 추가했습니다. 사용중인 데이터베이스에 따라

다음 해당 쿼리는 약간 더 빠를 수 있습니다 당신은 다른 사람으로합니다 (PIVOT 절을 사용하여,보다 간결한 방법으로 동일하게 달성 할 수

SELECT t.column1, 
     (SELECT SUM(column3) FROM table1 
     WHERE column1 = t.column1 AND column2 = 2010) AS "2010", 
     (SELECT SUM(column3) FROM table1 
     WHERE column1 = t.column1 AND column2 = 2011) AS "2011", 
     (SELECT SUM(column3) FROM table1 
     WHERE column1 = t.column1 AND column2 = 2012) AS "2012" 
FROM table1 t 
GROUP BY t.column1 
ORDER BY t.column1 

주 제안했다).

SELECT column1, "2010", "2011", "2012" 
FROM table1 
PIVOT (SUM(column3) FOR column2 IN (2010, 2011, 2012)) 

어떤 경우에, 나는 테이블 식 당 컬럼의 동적 번호를 가능하게하는 모든 데이터베이스를 모르는, XML 또는 다른 수단을 포함하는 트릭에 의존하지 않고 : 오라클 11g,이 번역 할 것 동적 SQL. 일반적으로, 그 트릭은 제가 여기서 제안한 것보다 훨씬 빠릅니다.

: 이것은 당신이 항상 당신의 쿼리 SQL에 따라

+1

이것은 확장 성이 뛰어납니다. 내년에 기록이 '2013'이라면 어떻게 될까요? – Curt

+0

질문은 이것이 가능하고 확장 할 수 없다는 것이 었습니다. Oracle과 SQL Server만이 더 간결하지만 본질적으로 같은'PIVOT' 절을 가지고 있습니다. 그럼에도 불구하고 지원하려는 추가 연도마다 쿼리를 수정해야합니다. 그 외에도, 테이블 식 당 동적 열 수를 허용하는 RDBMS를 알지 못합니다. –

+0

PIVOT에 맞습니다. amka에서 확장 성이 문제가되지 않는 경우. 당신의 솔루션이 더 좋습니다. 그리고 DB는 독립적입니다. – Kayser

1

시도의 PIVOT 절단

select column1 , [2010],[2011],[2012] 
from your_table 
PIVOT (MAX(column3) FOR column2 IN ([2010],[2011],[2012])) P 

EDIT1 당신이 열로 지원하려는 몇 년, 예측해야하고, 적응 것이다 의미 Column2가 동적이면 다음을 시도하십시오.

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(column2) 
        from your_table 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 



set @query = 'SELECT column1 , ' + @cols + ' from your_table 
      pivot 
      (
       MAX(column3) 
       for column2 in (' + @cols + ') 
      ) p ' 
print(@query) 
execute(@query) 
+0

당신의 솔루션은 훌륭하지만 DB가 다릅니다. DB 정보가 없으면 솔루션을 제안하기가 어렵습니다. – Kayser

관련 문제