2012-08-08 53 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