
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件)
- 最新から表示
- 回答順に表示

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/
t-kaさん、回答ありがとうございます。
今朝から回答を拝見し、いろいろ調べていました。
私にも理解できそう(?)なSQLでしたので、さっそく検証して
みようと思いました。
ところが、ちょっと気になったのですが、「MAX」と使っている
意味がよくわかりませんでした。
それで、これは私の質問の仕方が悪かったのだろうと思い、
大変失礼なのですが、この質問はいったん解決として、表現を変えた
文面ででもう一度質問させて頂きますので、再度回答頂けますでしょうか。
勝手言って申し訳ありません。
よろしくお願いいたします。
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を張ればデータ量が増えた場合でも対応出来るかもしれません。
nora1962さん、回答ありがとうございます。
しかも、日曜日早々に!
本当にありがとうございます。
それで、今朝から回答を拝見し、いろいろ調べていました。
私はまだ新米なものですから、回答の最初に「with」が出てきていて
混乱してしまいました。
今までSQLで見たことなかったものですから。
いろいろ調べて「with句」というものがあるのがわかりました。
でもnora1962さんの回答が私の質問にピッタリなのか
理解できない状況です。
それとちょっと気になったのですが、「年間の週数」の意味が
よくわかりませんでした。
それで、これは私の質問の仕方が悪かったのだろうと思い、
大変失礼なのですが、この質問はいったん解決として、表現を変えた
文面ででもう一度質問させて頂きますので、再度回答頂けますでしょうか。
勝手言って申し訳ありません。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
select文のwhere句に配列を入れ...
-
クエリ表示と、ADOで抽出したレ...
-
エクセルの関数について教えて...
-
エラー 1068 (42000): 複数の主...
-
SQLサーバから、項目の属性(型...
-
ソート順の一番若い者を取得する
-
ストアドのエラーについて
-
”photo id” とは何ぞや?
-
PL/SQLの変数について
-
NOT INをNOT EXISTSで書き直したい
-
「SELECTして取得できない場合...
-
selectした大量データをinsert...
-
Postgreのupdateコマンドでエラー
-
Unionした最後にGROUP BYを追加...
-
WordpressのContact form 7でzi...
-
【Transact-sql】 execの結果を...
-
#1136 - Column count doesn't ...
-
メルペイとメルペイid決済の違...
-
Pro COBOLでは、最後執行したS...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
VIEWの元のテーブルのindexって...
-
エラー 1068 (42000): 複数の主...
-
SQLサーバから、項目の属性(型...
-
select文のwhere句に配列を入れ...
-
SQL Left Join で重複を排除す...
-
Access パラメータクエリをcsv...
-
マイクラPC版のコマンドで効率...
-
【Transact-sql】 execの結果を...
-
sqlで、600行あるテーブルを100...
-
SQLにて特定の文字を除いた検索...
-
1テーブル&複数レコードの更新...
-
PL/SQLの変数について
-
WordpressのContact form 7でzi...
-
複数テーブルのGROUP BY の使い...
-
バインド変数について
-
inner joinをすると数がおかし...
-
MySQLのint型で001と表示する方...
-
updateを1行ずつ実行したい。
おすすめ情報