- PR -

列を行にしてデータを取得したい

1
投稿者投稿内容
glassco
会議室デビュー日: 2006/05/08
投稿数: 10
投稿日時: 2006-08-22 23:56
DB:SQLServer2005
こちらでははじめましてです。

現在SQLserver2005を使用して開発を行っているものです、

同じ属性([カラム名][型][長さ][主キー])を持つテーブルAとテーブルBが存在します。

このテーブルのデータを列を行にして表示したいと思っております。

↓の様な感じです。
コード:
テーブルA
キー|値1|値2|
-------------
ABCD|010|ASB|

テーブルB
キー|値1|値2|
-------------
ABCD|111|USD|

を
列名  |Aの値|Bの値|
-------------------
キー  |ABCD |ABCD |
値1   |010  |111  |
値2   |ASB  |USD  |



※取得の際には必ず、キーを指定し、
テーブルA,テーブルBのレコードはユニークになります。
(ただし、テーブルBにレコードがない場合もあります。)

のように表示したいのですが、
このように表示するには一列一列CASE文等で
定義してあげるしかないのでしょうか?

UNPIVOT等を使用して出来ればよいなとおもったのですが、
参考サイトなどを見てもいまいち記述方法がわかりません。

もし、参考になりそうなサイト、記述方法のわかる方がいらっしゃたら
ご教授いただけないでしょうか?

よろしくお願いいたします。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2006-08-23 09:14
たぶん1列ずつ切り出して、UNIONでつなげるしかないかと。

#私の脳ではここまでが限界っと
glassco
会議室デビュー日: 2006/05/08
投稿数: 10
投稿日時: 2006-08-23 10:15
かずくん様
早速のレスありがとうございます。

引用:

たぶん1列ずつ切り出して、UNIONでつなげるしかないかと。

#私の脳ではここまでが限界っと



やはりそうですか…
列数がかなり多いので、
出来れば一発のクエリかビューなどで出来たら
楽&安全かと思ったのですが…

ありがとうございます!
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-08-24 01:20
UNPIVOT(PIVOTも)SQLServer2005からの機能で
使った経験がある人は少ないかもしれませんね。

でUNPIVOTを使ってglasscoさんが望むものはできる気がします。

まず、1つだけをUNPIVOTしてみます。
#対象テーブル名=TestUP
#列名 key,val1,val2がそれぞれキー、値1、値2に該当します。
コード:

SELECT colName, valdata
FROM
(
SELECT [key],val1,val2 from TestUP
) p
UNPIVOT
(valdata for colname in ( [key],val1,val2) ) as inupvt1;



これで取得される結果は以下のようになります。
コード:

colName | valdata
------------------
key | ABCD
val1 | 010
val2 | ASB



colName に UNPIVOT〜以下にある
colName in ( [key], val1, val2)で指定したものの列名が入っています。
valdataにcolNameで指定した列にあるデータが入っています。

これを同様にもう1つのテーブルに対しても行い、
colNameが一致するものをつき合わせたら(colNameが等しいものをJOINしたら)、
ご希望の結果が取得されると思います。

SQLだとこんな感じになると思います。

コード:

select upvt1.colname, upvt1.valdata, upvt2.valdata
from
(
SELECT colName, valdata from
(
select [key],val1,val2 from TestUP
) p
UNPIVOT
(valdata for colname in ( [key],val1,val2) ) as inupvt1
) upvt1
join
(
SELECT colName, valdata from
(
select [key],val1,val2 from TestUP2
) p
UNPIVOT
(valdata for colname in ( [key],val1,val2) ) as ubupvt2
) upvt2
on upvt1.colName = upvt2.colName




コード:

colname | valdata | valdata
---------------------------
key | ABCD | ABCD
val1 | 010 | 111
val2 | ASB | USD



#JOINした実行結果を載せ忘れのたで、編集追記しました。

[ メッセージ編集済み 編集者: 夏椰 編集日時 2006-08-24 01:22 ]
1

スキルアップ/キャリアアップ(JOB@IT)