9

以下の表Aがあります。ここでは、一意のIDごとに、何らかの値を持つ3つのコードがあります。

 ID    Code    Value
---------------------
 11       1       x
 11       2       y
 11       3       z
 12       1       p
 12       2       q
 12       3       r
 13       1       l
 13       2       m
 13       3       n

次のような形式の2番目のテーブルBがあります。

Id   Code1_Val   Code2_Val    Code3_Val

ここでは、一意のIDごとに1つの行があります。最初のテーブルのIDごとに、最初のテーブルAのこの2番目のテーブルBにデータを入力します。

上記の最初のテーブルAの場合、2番目のテーブルBは次のようになります。

Id   Code1_Val   Code2_Val    Code3_Val
---------------------------------------------
11       x          y             z
12       p          q             r
13       l          m             n

単一のSQLクエリでこれをどのように達成できますか?

4

7 に答える 7

3

バージョンに がない場合はDECODE()、これも使用できます。

INSERT INTO B (id, code1_val, code2_val, code3_val)  
WITH Ids (id) as (SELECT DISTINCT id
                  FROM A) -- Only to construct list of ids

SELECT Ids.id, a1.value, a2.value, a3.value
FROM Ids -- or substitute the actual id table
JOIN A a1
     ON a1.id = ids.id
        AND a1.code = 1
JOIN A a2
     ON a2.id = ids.id
        AND a2.code = 2
JOIN A a3
     ON a3.id = ids.id
        AND a3.code = 3

(私の V6R1 DB2 インスタンスで動作し、SQL Fiddle Exampleがあります)。

于 2012-11-27T19:37:48.353 に答える
3
SELECT Id,
max(DECODE(Code, 1, Value)) AS Code1_Val,
max(DECODE(Code, 2, Value)) AS Code2_Val,
max(DECODE(Code, 3, Value)) AS Code3_Val
FROM A
group by Id
于 2016-11-06T12:22:07.250 に答える
0

SQLFiddle の例を次に示します。

insert into B (ID,Code1_Val,Code2_Val,Code3_Val)
select Id, max(V1),max(V2),max(V3) from
(
select ID,Value V1,'' V2,'' V3 from A where Code=1
union all
select ID,'' V1, Value V2,'' V3 from A where Code=2
union all
select ID,'' V1, '' V2,Value V3 from A where Code=3
) AG
group by ID
于 2012-11-27T07:23:07.400 に答える
0
 WITH Ids (id) as 
 (
  SELECT DISTINCT id FROM A
  )
 SELECT Ids.id, 
 (select sub.value from A sub where Ids.id=sub.id and sub.code=1 fetch first rows only) Code1_Val,

 (select sub.value from A sub where Ids.id=sub.id and sub.code=2 fetch first rows only) Code2_Val,

 (select sub.value from A sub where Ids.id=sub.id and sub.code=3 fetch first rows only) Code3_Val
 FROM Ids
于 2016-11-06T12:31:27.797 に答える
0

データをピボットしたい。DB2 にはピボット機能がないため、Decode (基本的には case ステートメント) を使用できます。

構文は次のとおりです。

SELECT Id,
   DECODE(Code, 1, Value) AS Code1_Val,
   DECODE(Code, 2, Value) AS Code2_Val,
   DECODE(Code, 3, Value) AS Code3_Val
FROM A
于 2012-11-27T07:27:05.763 に答える