0

次のテーブルをピボットすることは可能かどうか疑問に思います。

10  A  ddd
24  B  fff
34  B  ddd
12  A  ddd

このようにピボットする必要があります

A  B  text
-- -- ----
22 34 ddd
0  24 fff
4

2 に答える 2

1

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 |
于 2013-01-17T17:27:34.303 に答える
0

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
于 2013-01-17T19:07:25.103 に答える