プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。以下のようにデータ検索するテクニックをご教授ください。

(1) 商品マスタ(商品コード、商品名)の状態
A,ラーメン
B,カツ丼
C,カレー

(2) 消費テーブル(氏名、商品コード)の状態
田中,A
田中,B
田中,C
林,B


これらのデータを元に以下のようにデータを取得。
A.氏名を「田中」で条件指定
→ 田中,ラーメン,カツ丼,カレー
B.氏名を「林」で条件指定
→ 林,カツ丼

ポイントは
(1)消費テーブルには、氏名ごとに複数レコード存在するが、それらを1レコードにまとめる
(2)条件に応じて、列数を動的に変える

表現が稚拙で恐縮ですが、よろしくお願いします。

A 回答 (2件)

SQL Serverのバージョンは?



列数を可変というのが、実際に最大何列くらいになるのかにもよりますが。

ぱっと思いついたままを書くと、

(1)最大列数を固定にし、くっつける行がない場合は、''(長さが0の文字)をくっつけるといった方法を使えば、シンプルに実現できるかも知れません。
(2)いろいろな要件を満たすには、ストアドプロシジャでやる
(3)可能な限り「SQLだけ」で実現したいなら、SQL Server 2005以降であれば、WITH句で再帰クエリを行いながら、列値を連結していくといった方法も考えられます。

この回答への補足

3rd_001さん、chukenkenkouさん

早速のご回答ありがとうございました。
SQLServerのバージョンは 2008で、最大列数は10程度を想定しています。

出来るのであればテーブル型関数で実装して、呼び出し側からはシンプルに
SELECT * FROM function_name(氏名)
を発行することで、可変の列数を取得したい、と考えています。

まあ、要件が満たせられればテーブル型関数には拘りませんが・・・
いろいろなご提案をいただき、ありがとうございます。
上述の要件を満たすには、どのチョイスが実装し易そうでしょうか。
(技術レベルが低くて恐縮です。簡単な例をいただけると助かります)

補足日時:2011/02/09 19:50
    • good
    • 0

縦横変換でよくあるパターンですが、動的というのがどこまでかにもよります。


※無限というわけにはいきません。

単純なSQLですとCASE文とGroupByで対応可能ですが、あくまでCASE文を指定する数だけしか対応できません。

本当に不定(10や20ではきかない)ならは氏名でループして【商品コード】【商品名】を連結していく処理を実装したほうが良い気がします。
これをDBのストアドプロシージャでやらせるか、クライアント側でやらせるかは要件しだいです。

自分でなら配列を連結させるような共通関数を作ってクライアントでやらせます。

この回答への補足

3rd_001さん

早速のご回答ありがとうございました。
chukenkenkouさんの補足に記載させていただきましたが、
簡単な例をいただけると幸いです。よろしくお願いします。

補足日時:2011/02/09 19:53
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A