SQLについて(sql server)教えてください。


下記(1)のような商品とスペックを表わしたデータがあります。
商品のスペック毎に行が存在しています。

これを(2)のように商品毎に一行にまとめるためにはどのように記述すればいいのでしょうか?

(1)
商品ID,スペックID,スペック値
--------------------
1,sp1,10cm
1,sp2,15kg
1,sp3,89
2,sp3,34
3,sp1,12cm

(2)
商品ID,sp1,sp2,sp3
--------------------
1,10cm,15kg,89
2,,,34
3,12cm,,

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2008/07/08 15:17:23
  • 終了:2008/07/15 15:20:03

回答(3件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012008/07/08 16:15:41

ポイント27pt
SELECT 商品ID
  ,(SELECT TOP 1 スペック値 FROM 商品 WHERE 商品ID = T1.商品ID AND スペックID='sp1') AS sp1
  ,(SELECT TOP 1 スペック値 FROM 商品 WHERE 商品ID = T1.商品ID AND スペックID='sp2') AS sp2
  ,(SELECT TOP 1 スペック値 FROM 商品 WHERE 商品ID = T1.商品ID AND スペックID='sp3') AS sp3
FROM 商品 AS T1
GROUP BY 商品ID;

問題文からは重複は無いものと勝手に判断しておりますがどうでしょう?

重複があるようであれば、ストアドが得意な人からの

文字列加算を加えたクロス集計のものが回答されるのを願うばかりですが・・・

すみませんが上記、動作確認はしておりませんので、適宜修正をお願いいたします。

下記URLは余談です。

PIVOT と UNPIVOT の使用

id:chuken_kenkou No.2

chuken_kenkou回答回数722ベストアンサー獲得回数542008/07/08 16:32:25

ポイント27pt

SQL Serverのバージョンは、何でしょうか?

SQL Server 2005以降なら、PIVOT機能が実装されています。

PIVOT と UNPIVOT の使用



それより前のSQL Server、あるいは他のRDBMSでも応用できるSQLとしては次のような方法が

あります。

select
  商品ID,
  max(case スペックID when 'sp1' then スペック値 else null end) as "sp1",
  max(case スペックID when 'sp2' then スペック値 else null end) as "sp2",
  max(case スペックID when 'sp3' then スペック値 else null end) as "sp3"
 from t1
 group by 商品ID
 order by 商品ID

ここで、max関数を使っているのは、group byとの関連で文法上許される記述にするために指定

しており、今回の場合、min関数でも結果は同じです。インラインビューなどを使ってmax関数を

使用しないようにもできますが、記述が複雑になってきます。

id:beatgoeson No.3

beatgoeson回答回数128ベストアンサー獲得回数142008/07/08 16:58:49

ポイント26pt

http://www.yahoo.co.jp/

URLはダミーです。


このテーブルを[syouhin]、スペックIDはsp3までしかないと仮定。

select

rtrim(s0.[商品ID]) + ',' + rtrim(isnull(s1.[スペック値],'')) + ',' + rtrim(isnull(s2.[スペック値],'')) + ',' + rtrim(isnull(s3.[スペック値],''))

from

( select distinct [商品ID] from syouhin ) s0,

( select [商品ID],[スペック値] from syouhin where [スペックID]='sp1') s1,

( select [商品ID],[スペック値] from syouhin where [スペックID]='sp2') s2,

( select [商品ID],[スペック値] from syouhin where [スペックID]='sp3') s3

where

s0.[商品ID] *= s1.[商品ID] and

s0.[商品ID] *= s2.[商品ID] and

s0.[商品ID] *= s3.[商品ID]

でいかがでしょう。実際に検証もしてみました。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません