• 締切済み

SQLを教えて下さい。

VB2010 と SQL Server 2008R2でWindowsアプリを作成しています。 以下に様なDataGridViewを作成したいと考えています。 品名ID 月曜 入荷 出荷 火曜 入荷 出荷 水曜 入荷 出荷 木曜 入荷 出荷 金曜 入荷 出荷 aaaaaa 6/12 2000 1500 6/13 1000 1000 6/14 1300 2000 6/15 3300 2000 6/16 3200 3500 bbbbbb 6/12 1000 2500 6/13 3000 4500 6/14 4200 3000 6/15 2000 1000 6/16 2000 2700 cccccc 6/12 1000 1500 6/13 1000 3400 6/14 1700 2600 6/15 3500 1000 6/16 2500 2200 dddddd 6/12 1500 1800 6/13 2200 1000 6/14 3300 1000 6/15 4100 2200 6/16 1000 1500  ・  ・ テーブルはこのように構成されています。 【table_meisai】 meisai_id hinmei_id date in_suryo out_suryo ですので、一遍にこのDataGridViewに表現するのは無理な感じです。 それで以下のように考えました。 1)「hinmei_id = aaaa」と「date between 6/12 and 6/16」を条件とした検索を行う。 2)1)の検索結果をテンポラリーテーブルに書き込む。 3)1)の検索を「hinmei_id = bbbbb」に変えて行う。 4)3)の結果をテンポラリーテーブルに書き込む。 5)3)と4)をすべての hinmei_id に対して行う。 6)作成されたテンポラリーテーブルに対して検索し、結果をDataGridViewに表示する。 というやり方でできるのではないかと考えています。 ですが、実際にSQLをどのように組み立てたらもいのかさっぱりわかりません。 ご指導下さい。 また、もしかしたら、上記の1)~6)のアプローチ自体が間違っているのかもしれません。 他の方法があったら教えて下さい。 よろしくお願い致します。

みんなの回答

  • t-ka
  • ベストアンサー率28% (14/50)
回答No.2

少し違う形ですけど、検索範囲がかわっても単純だから動的に組み易いかな select hinmei_id ,MAX([6-12_in]) as '6-12_in' ,MAX([6-12_out]) as '6-12_out' ,MAX([6-13_in]) as '6-13_in' ,MAX([6-13_out]) as '6-13_out' ,MAX([6-14_in]) as '6-14_in' ,MAX([6-14_out]) as '6-14_out' ,MAX([6-15_in]) as '6-15_in' ,MAX([6-15_out]) as '6-15_out' ,MAX([6-16_in]) as '6-16_in' ,MAX([6-16_out]) as '6-16_out' FROM( select hinmei_id ,ROW_NUMBER()over(partition by date order by hinmei_id ) as 'R' ,case [date] when '2011-06-12' then in_suryo else null end as '6-12_in' ,case [date] when '2011-06-12' then out_suryo else null end as '6-12_out' ,case [date] when '2011-06-13' then in_suryo else null end as '6-13_in' ,case [date] when '2011-06-13' then out_suryo else null end as '6-13_out' ,case [date] when '2011-06-14' then in_suryo else null end as '6-14_in' ,case [date] when '2011-06-14' then out_suryo else null end as '6-14_out' ,case [date] when '2011-06-15' then in_suryo else null end as '6-15_in' ,case [date] when '2011-06-15' then out_suryo else null end as '6-15_out' ,case [date] when '2011-06-16' then in_suryo else null end as '6-16_in' ,case [date] when '2011-06-16' then out_suryo else null end as '6-16_out' from meisai )X group by R ,hinmei_id 下記を参考にしました。 

参考URL:
http://www.oreilly.co.jp/books/9784873113159/
panasobi
質問者

お礼

t-kaさん、回答ありがとうございます。 今朝から回答を拝見し、いろいろ調べていました。 私にも理解できそう(?)なSQLでしたので、さっそく検証して みようと思いました。 ところが、ちょっと気になったのですが、「MAX」と使っている 意味がよくわかりませんでした。 それで、これは私の質問の仕方が悪かったのだろうと思い、 大変失礼なのですが、この質問はいったん解決として、表現を変えた 文面ででもう一度質問させて頂きますので、再度回答頂けますでしょうか。 勝手言って申し訳ありません。 よろしくお願いいたします。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

基本的にはシーケンシャルリードで読みながら加工する方が効率がよさそうです。 与件がよく分かりませんが、 datepart( week, 日付項目 ) で年間の週数が求められます。 後、「DATE」は予約語のはずなので出来れば変えたほうがいいと思います。 with p as ( select hinmei_id, [date], datepart(week,[date]) as [週数], datepart(weekday,[date]) as [曜日], in_suryo,out_suryo from table_meisai ), t as ( select distinct hinmei_id, datepart(week,[date]) as [週数] from table_meisai ) select t.hinmei_id, p1.[date], p1.in_suryo, p1.out_suryo, p2.[date], p2.in_suryo, p2.out_suryo, p3.[date], p3.in_suryo, p3.out_suryo, p4.[date], p4.in_suryo, p4.out_suryo, p5.[date], p5.in_suryo, p5.out_suryo, p6.[date], p6.in_suryo, p6.out_suryo, p7.[date], p7.in_suryo, p7.out_suryo from t left join ( select * from p where [曜日]=1) as p1 on t.hinmei_id=p1.hinmei_id and t.[週数]=p1.[週数] left join ( select * from p where [曜日]=2) as p2 on t.hinmei_id=p2.hinmei_id and t.[週数]=p2.[週数] left join ( select * from p where [曜日]=3) as p3 on t.hinmei_id=p3.hinmei_id and t.[週数]=p3.[週数] left join ( select * from p where [曜日]=4) as p4 on t.hinmei_id=p4.hinmei_id and t.[週数]=p4.[週数] left join ( select * from p where [曜日]=5) as p5 on t.hinmei_id=p5.hinmei_id and t.[週数]=p5.[週数] left join ( select * from p where [曜日]=6) as p6 on t.hinmei_id=p6.hinmei_id and t.[週数]=p6.[週数] left join ( select * from p where [曜日]=7) as p7 on t.hinmei_id=p7.hinmei_id and t.[週数]=p7.[週数] JOIN回数が多いのでWITH句を使うよりもpをテーブル化して(himei_id, [date])でINDEXを張ればデータ量が増えた場合でも対応出来るかもしれません。

panasobi
質問者

お礼

nora1962さん、回答ありがとうございます。 しかも、日曜日早々に! 本当にありがとうございます。 それで、今朝から回答を拝見し、いろいろ調べていました。 私はまだ新米なものですから、回答の最初に「with」が出てきていて 混乱してしまいました。 今までSQLで見たことなかったものですから。 いろいろ調べて「with句」というものがあるのがわかりました。 でもnora1962さんの回答が私の質問にピッタリなのか 理解できない状況です。 それとちょっと気になったのですが、「年間の週数」の意味が よくわかりませんでした。 それで、これは私の質問の仕方が悪かったのだろうと思い、 大変失礼なのですが、この質問はいったん解決として、表現を変えた 文面ででもう一度質問させて頂きますので、再度回答頂けますでしょうか。 勝手言って申し訳ありません。 よろしくお願いいたします。