3

私はこのSOの質問(DB2でテーブルをピボットするにはどうすればよいですか?)を見て、いくつかの回答/コメントは、caseステートメントで同じ効果を達成できると述べていますが、おそらくこれを達成するのに非常に苦労しています。多くのSQLから数年離れています。

これが私が持っているいくつかのデータのスナップショットです:

ID    Date          ErrID   ErrDesc
---------------------------------------
164   2012-09-21    1402    Large V
164   2012-09-21    1409    Missing
416   2012-09-21    1409    Missing
1380  2012-09-21    1411    n - Mis
1500  2012-09-17    1411    n - Mis
1500  2012-09-21    1402    Large V

ID日付を一緒に取ると、空のスロットがnullである次のようなものを返すクエリで一意である必要があります。ケースステートメントなどを使用して、これをどのように達成できますか?私たちのバージョンのDB2は「デコード」をサポートしていないと思います。また、必要なSQLは、テストのためにDerbyで実行できる必要があります。前もって感謝します。

ID      Date        Err1402     Err1409     Err1411
-----------------------------------------------------------------------
164     2012-09-21  Large V     Missing
416     2012-09-21              Missing
1380    2012-09-21                          n - Mis
1500    2012-09-17                          n - Mis
1500    2012-09-21  Large V 
4

1 に答える 1

8

CASE集計関数で使用するクエリのバージョンは次のとおりです。

select id,
  date,
  max(case when errid = 1402 then ErrDesc else '' end) Err1402,
  max(case when errid = 1409 then ErrDesc else '' end) Err1409,
  max(case when errid = 1411 then ErrDesc else '' end) Err1411
from yourtable
group by id, date
order by id

SQL Fiddle with Demo(SQLサーバーバージョン)を参照してください。空の文字列を。に置き換えることができますnull

select id,
  date,
  max(case when errid = 1402 then ErrDesc else null end) Err1402,
  max(case when errid = 1409 then ErrDesc else null end) Err1409,
  max(case when errid = 1411 then ErrDesc else null end) Err1411
from yourtable
group by id, date
order by id

編集#1:これを正しく機能させるための鍵は、集計関数です。CASEステートメントは各値ErrIdを列に配置していますが、集計関数を使用しない場合は、ID、日付ごとに複数の行が表示されます。したがって、使用する場合:

select id,
  date,
  (case when errid = 1402 then ErrDesc else '' end) Err1402,
  (case when errid = 1409 then ErrDesc else '' end) Err1409,
  (case when errid = 1411 then ErrDesc else '' end) Err1411
from yourtable
order by id

結果は次のとおりです。

|   ID |                             DATE | ERR1402 | ERR1409 | ERR1411 |
-------------------------------------------------------------------------
|  164 | September, 21 2012 00:00:00+0000 | Large V |         |         |
|  164 | September, 21 2012 00:00:00+0000 |         | Missing |         |
|  416 | September, 21 2012 00:00:00+0000 |         | Missing |         |
| 1380 | September, 21 2012 00:00:00+0000 |         |         | n - Mis |
| 1500 | September, 17 2012 00:00:00+0000 |         |         | n - Mis |
| 1500 | September, 21 2012 00:00:00+0000 | Large V |         |         |

ご覧のとおり、id=1500不要な複数の行が表示されます。したがって、それぞれのmax()値が必要であると指定するerridと、レコードごとに1つの行が取得されます。

于 2013-01-03T16:44:43.507 に答える