2012-08-08 81 views
0

OracleSQL。可能嗎?

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 2012-08-08 08:27:45

+3

你使用哪個數據庫? – Kayser 2012-08-08 08:33:42

回答

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有重複的值。

,取決於您所使用的數據庫,下面的等效查詢可能會更快一點:

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 

請注意,您也可以達到同樣以更簡潔的方式,使用PIVOT條款(如其他已建議)。在的Oracle 11g,這將轉化:

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

在任何情況下,我不知道,允許每個表表達式列的動態數量的任何數據庫,而不訴諸涉及XML或其它手段花樣的動態SQL。通常,這些技巧並不比我在這裏提出的要快得多。這意味着,你總能預見到,你要多少年,以支持爲列,並適應您的查詢相應

+1

這不是很有伸縮性。如果明年的記錄是「2013」​​,會發生什麼? – Curt 2012-08-08 08:31:31

+0

問題是關於這是可能的,不可擴展的。只有Oracle和SQL Server附帶一個'PIVOT'子句,它更簡潔但基本相同。即使那樣,你也必須爲每一個你想要支持的年份調整查詢。除此之外,我不知道任何允許每個表格表達動態列數的RDBMS ... – 2012-08-08 08:33:08

+0

您對PIVOT有幫助。如果可伸縮性對amka不是問題。你的解決方案更好。和數據庫無關。 – Kayser 2012-08-08 08:36:22

1

嘗試PIVOT在SQL斷絕

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

你的解決方案很好,但數據庫特定。沒有數據庫信息,很難提出解決方案。 – Kayser 2012-08-08 08:38:20