次のテーブルをピボットすることは可能かどうか疑問に思います。
10 A ddd
24 B fff
34 B ddd
12 A ddd
このようにピボットする必要があります
A B text
-- -- ----
22 34 ddd
0 24 fff
次のテーブルをピボットすることは可能かどうか疑問に思います。
10 A ddd
24 B fff
34 B ddd
12 A ddd
このようにピボットする必要があります
A B text
-- -- ----
22 34 ddd
0 24 fff
PIVOT
このための関数を使用できます:
select IsNull(A, 0) A,
IsNull(B, 0) B,
txt
from
(
select num, let, txt
from yourtable
) src
pivot
(
sum(num)
for let in (A, B)
) piv
SQL FiddlewithDemoを参照してください
値がわかっている場合は、上記のクエリと同様に値をハードコーディングできます。ただし、値の数が不明な場合は、動的SQLを使用してクエリ文字列を作成できます。動的SQLコードは次のようになります。
DECLARE @cols AS NVARCHAR(MAX),
@colsNull AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Let)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @colsNull = STUFF((SELECT distinct ',IsNull(' + QUOTENAME(Let)+', 0) as '+QUOTENAME(Let)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @colsNull + ', txt from
(
select num, let, txt
from yourtable
) x
pivot
(
sum(num)
for let in (' + @cols + ')
) p '
execute(@query)
SQL FiddlewithDemoを参照してください
両方のクエリの結果は次のとおりです。
| A | B | TXT |
-----------------
| 22 | 34 | ddd |
| 0 | 24 | fff |
Oracleクエリ:
SELECT NVL(DECODE(area, 'A', total), 0) A
, NVL(DECODE(area, 'B', total), 0) B
, val
FROM
(
SELECT area, SUM(id) total, val
FROM stack_test
GROUP BY area, val
)
/
A B VAL
-- -- --
0 24 fff
22 0 ddd
0 34 ddd