0

オラクル

テーブル1から*を選択します。

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     |
4

2 に答える 2

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()備えて、集計関数を追加したことに注意してください。colum3column1, 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 を使用したトリックに頼らずに、テーブル式ごとに動的な列数を許可するデータベースを私は知りません。通常、これらのトリックは、ここで提案したものよりもはるかに高速ではありません。つまり、列としてサポートする年数を常に予測し、それに応じてクエリを調整する必要があります

于 2012-08-08T08:30:50.453 に答える
1

SQLサーバーでPIVOTを試す

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

編集1

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)
于 2012-08-08T08:32:04.850 に答える