重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

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)のアプローチ自体が間違っているのかもしれません。
他の方法があったら教えて下さい。


よろしくお願い致します。

A 回答 (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/
    • good
    • 0
この回答へのお礼

t-kaさん、回答ありがとうございます。

今朝から回答を拝見し、いろいろ調べていました。
私にも理解できそう(?)なSQLでしたので、さっそく検証して
みようと思いました。

ところが、ちょっと気になったのですが、「MAX」と使っている
意味がよくわかりませんでした。

それで、これは私の質問の仕方が悪かったのだろうと思い、
大変失礼なのですが、この質問はいったん解決として、表現を変えた
文面ででもう一度質問させて頂きますので、再度回答頂けますでしょうか。

勝手言って申し訳ありません。

よろしくお願いいたします。

お礼日時:2011/06/27 15:05

基本的にはシーケンシャルリードで読みながら加工する方が効率がよさそうです。


与件がよく分かりませんが、
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を張ればデータ量が増えた場合でも対応出来るかもしれません。
    • good
    • 0
この回答へのお礼

nora1962さん、回答ありがとうございます。
しかも、日曜日早々に!
本当にありがとうございます。

それで、今朝から回答を拝見し、いろいろ調べていました。
私はまだ新米なものですから、回答の最初に「with」が出てきていて
混乱してしまいました。
今までSQLで見たことなかったものですから。

いろいろ調べて「with句」というものがあるのがわかりました。
でもnora1962さんの回答が私の質問にピッタリなのか
理解できない状況です。

それとちょっと気になったのですが、「年間の週数」の意味が
よくわかりませんでした。

それで、これは私の質問の仕方が悪かったのだろうと思い、
大変失礼なのですが、この質問はいったん解決として、表現を変えた
文面ででもう一度質問させて頂きますので、再度回答頂けますでしょうか。

勝手言って申し訳ありません。

よろしくお願いいたします。

お礼日時:2011/06/27 15:01

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

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