是
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。通常,这些技巧并不比我在这里提出的要快得多。这意味着,你总能预见到,你要多少年,以支持为列,并适应您的查询相应
要回答主题中的问题:是的,SQL绝对有可能。 – JJJ 2012-08-08 08:27:45
你使用哪个数据库? – Kayser 2012-08-08 08:33:42