• 締切済み

SQLがわかりません。その2

VB2010とSQL Server2008 R2 でWindowsアプリを作っている新米です。 下のような表(DataDridView)で表示したいと考えています。(本当は月曜から金曜までの 5日間ですが、便宜上4日間で表現しました。) 品名ID 月曜 入荷 出荷 火曜 入荷 出荷 水曜 入荷 出荷 木曜 入荷 出荷 aaaaaa 6/12 2000 1500 6/13 1000 1000 6/14 1300 2000 6/15 3300 2000 bbbbbb 6/12 1000 2500 6/13 3000 4500 6/14 4200 3000 6/15 2000 1000 cccccc 6/12 1000 1500 6/13 1000 3400 6/14 1700 2600 6/15 3500 1000 dddddd 6/12 1500 1800 6/13 2200 1000 6/14 3300 1000 6/15 4100 2200  ・  ・ テーブル(table_meisai)はこのように構成されています。 meisai_id hinmei_id date in_suryo out_suryo したがって SELECT hinmei_id,date,in_suryo,out_suryo FROM table_meisai WHERE date BETWEEN 6/12 AND 6/16 とすると、当然のことながら aaaaaa 6/12 2000 1500 aaaaaa 6/13 1000 1000 aaaaaa 6/14 1300 2000 aaaaaa 6/15 3300 2000 aaaaaa 6/16 3200 3500 bbbbbb 6/12 1000 2500 bbbbbb 6/13 3000 4500  ・  ・ と出てきてしまうわけです。 で、これを上記のような「hinmei_id」単位で1行にした「表」にしたいと考えているのですが、 そのSQLがわからないという状況です。 SQLの組立て方法を教えて下さい。 よろしくお願いします。

みんなの回答

  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.4

補足 週の数え方については以下を参照。 http://ja.wikipedia.org/wiki/%E6%97%A5%E4%BB%98 http://msdn.microsoft.com/ja-jp/library/ms174420.aspx 製造系だと週の考え方がやっかいです。 多分、指摘されます。

  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.3

参考までに。 create table table_meisai ( meisai_id int, hinmei_id varchar(10) date datetime, in_suryo int, out_suryo int ); insert into table_meisai values(1,'aaaaaa','2011/6/12',2000,1500); insert into table_meisai values(2,'aaaaaa','2011/6/13',1000,1000); insert into table_meisai values(3,'aaaaaa','2011/6/14',1300,2000); insert into table_meisai values(4,'aaaaaa','2011/6/15',3300,2000); insert into table_meisai values(5,'aaaaaa','2011/6/16',3200,3500); insert into table_meisai values(6,'bbbbbb','2011/6/12',1000,2500); insert into table_meisai values(7,'bbbbbb','2011/6/13',3000,4500); 明細行をCASE文で横展開して段々のデータに変換、 段々になっているのをキー項目で集計することで1行に集計する方法。 (1)各日付の曜日を求める。DATEPART(w, date) (2)求めた曜日をCASE文で判定し、各曜日に振り分ける。 (3)集計する際、週をわけないとNGなので週数も求める。 DATEPART(ww, date) (4)品名IDと週数をキーにして集計する。 各曜日の日付は週数をキーにしているので一意になるはずなので、maxを指定する。minでも可。単に集計関数を指定しないとエラーになるから指定しているだけです。 同じく、各週の入庫・出庫も集計関数を指定しないとエラーになるのでsumをかける。 以下は推測です。 ※横の数を決める必要があるので土日も追加した。 ※そもそも、週が異なる場合、2行にならないとおかしいので週数を追加した。 ※6月12日は日曜日。 select hinmei_id, DATEPART(ww, date) as 週, -- max(case when DATEPART(w, date) = 1 THEN date else null end ) as 日曜日, sum(case when DATEPART(w, date) = 1 THEN in_suryo else null end ) as 日曜_入庫, sum(case when DATEPART(w, date) = 1 THEN out_suryo else null end ) as 日曜_出庫, -- max(case when DATEPART(w, date) = 2 THEN date else null end ) as 月曜日, sum(case when DATEPART(w, date) = 2 THEN in_suryo else null end ) as 月曜_入庫, sum(case when DATEPART(w, date) = 2 THEN out_suryo else null end ) as 月曜_出庫, -- max(case when DATEPART(w, date) = 3 THEN date else null end ) as 火曜日, sum(case when DATEPART(w, date) = 3 THEN in_suryo else null end ) as 火曜_入庫, sum(case when DATEPART(w, date) = 3 THEN out_suryo else null end ) as 火曜_出庫, -- max(case when DATEPART(w, date) = 4 THEN date else null end ) as 水曜日, sum(case when DATEPART(w, date) = 4 THEN in_suryo else null end ) as 水曜_入庫, sum(case when DATEPART(w, date) = 4 THEN out_suryo else null end ) as 水曜_出庫, -- max(case when DATEPART(w, date) = 5 THEN date else null end ) as 木曜日, sum(case when DATEPART(w, date) = 5 THEN in_suryo else null end ) as 木曜_入庫, sum(case when DATEPART(w, date) = 5 THEN out_suryo else null end ) as 木曜_出庫, -- max(case when DATEPART(w, date) = 6 THEN date else null end ) as 金曜日, sum(case when DATEPART(w, date) = 6 THEN in_suryo else null end ) as 金曜_入庫, sum(case when DATEPART(w, date) = 6 THEN out_suryo else null end ) as 金曜_出庫, -- max(case when DATEPART(w, date) = 7 THEN date else null end ) as 土曜日, sum(case when DATEPART(w, date) = 7 THEN in_suryo else null end ) as 土曜_入庫, sum(case when DATEPART(w, date) = 7 THEN out_suryo else null end ) as 土曜_出庫 from table_meisai group by hinmei_id,DATEPART(ww, date) 考え方は示したので参考にしてください。

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

昨日の者です。ごめんなさい AS400VBNET さんのコードで正解です。 歳かな?。4X MAXの説明? スカラ値にすること。   私のでは aaaaaa 6/12 2000 1500 aaaaaa 6/13 1000 1000 aaaaaa 6/14 1300 2000 aaaaaa 6/15 3300 2000 aaaaaa 6/16 3200 3500 bbbbbb 6/12 1000 2500 bbbbbb 6/13 3000 4500 にもう一つ aaaaaa 6/12 999 499 なんてデータがあったら破たんします。

回答No.1

出力形式に問題があると思われますが、 下記内容で表示は可能と思います。(未確認) SELECT hinmei_id, '6/12' AS 月曜, SUM(CASE WHEN date = '2011/06/12 00:00:00' THEN in_suryo ELSE 0 END) AS 入荷, SUM(CASE WHEN date = '2011/06/12 00:00:00' THEN out_suryo ELSE 0 END) AS 出荷, '6/13' AS 火曜, SUM(CASE WHEN date = '2011/06/12 00:00:00' THEN in_suryo ELSE 0 END) AS 入荷, SUM(CASE WHEN date = '2011/06/12 00:00:00' THEN out_suryo ELSE 0 END) AS 出荷 FROM Table GROUP BY hinmei_id 日付に関してはSQL文を発行するときに動的に変更する必要があります。

関連するQ&A

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

  • SQLについて質問します

    VB2010 とSQL Server2008 R2 で開発をしています。 担当者テーブル(table_tanto)と売上明細テーブル(table_uriage_meisai)があります。 各テーブルのカラムは以下です。 table_tanto ・tanto_id ・tanto_name table_uriage_meisai ・meisai_id ・tanto_id ・kingaku ・date ある期間の担当者別の売上実績を一覧で出力したいと考えています。 「table_uriage_meisai」の「date」で範囲指定したいと思います。 結果はこんな形を望んでいます。 担当者ID 担当者名 売上合計 0001   ○○○   ****** 0002   □□□      0 0003   △△△   ****** 0004   ●●●   ****** 2点質問があります。 売上の無かった担当者も含めてすべての担当者の一覧を出したいと考えています。 そのSQlがわからないのと、売上がなかった担当者はその列がNullになってしまうと思うんですが、後の計算で困ります。 Nullのときゼロを返すようにするにはどうしたらよいでしょうか。 以上2点について教えて下さい。 よろしくお願いします。

  • SQL Server を使っています。SQLの質問です。

    SQL Server を使っています。SQLの質問です。 得意先テーブルと商品テーブルと売上明細テーブルがあります。 一つの商品に関して得意先ごとに最新の売上明細データの一覧を作成したいと考えて います。 ■売上明細データ 明細ID (meisai_id) 得意先ID (tokuisaki_id) 商品ID  (syohin_id) 売上金額(uriage_kingaku) 売上日 (uriage_date) ■売上明細データ(table_uri_maisai) meisai_id tokuisaki_id syohin_id uriage_kingaku uriage_date =================================================================   1     aaa     001     100     2010/01/01   2     aaa     002     200     2010/01/01   3     bbb     001     105     2010/01/02   4     bbb     002     205     2010/01/02   5     ccc     001     110     2010/01/03   6     ccc     002     210     2010/01/03   7     aaa     001     100     2010/01/04   8     aaa     002     200     2010/01/04   9     bbb     001     105     2010/01/05   10     bbb     002     205     2010/01/05   11     ccc     001     110     2010/01/06   12     ccc     002     210     2010/01/06 上のような明細があり、「syohin_id」が「001」のデータに関して、 得意先ごとの最新のデータだけを抽出したいと考えています。 この場合ですと、以下の3件のデータが抽出できればよいわけです。   7     aaa     001     100     2010/01/04   9     bbb     001     105     2010/01/05   11     ccc     001     110     2010/01/06 tokuisaki_id と syohin_id の2つを特定して1件のデータを抽出するには 以下のSQLで実現できましたが、syohin_id だけを指定して複数のデータを 出すことがどうしてもできません。 SELECT * FROM table_uri_meisai WHERE uriage_date = (select max(uriage_date) FROM table_uri_meisai WHERE tokuisaki_id = 1 AND syohin_id = 1) AND tokuisaki_id = 1 AND syohin_id = 1 どなたかご指導ください。 よろしくお願いします。

  • SQL文を教えてください。

    特定の日付Xを指定した場合、 以下のような結果になるSQL文を教えてください。 よろしくお願いします。 1) 日付X = 2003-12-17 の場合 ID table_A_DATE table_B_DATE table_C_DATE ------------------------------------------------ 001 2003-12-10 2003-12-12 2003-12-14 002 2003-12-15 ---------- 2003-12-16 003 2003-12-06 2003-12-10 ---------- 004 2003-12-08 ---------- ---------- 2) 日付X = 2003-12-11 の場合 ID table_A_DATE table_B_DATE table_C_DATE ------------------------------------------------ 003 2003-12-06 2003-12-10 ---------- 004 2003-12-08 ---------- ---------- table A(テーブルAには全ユーザのデータがあります) ID DATE ------------------ 001 2003-12-10 002 2003-12-15 003 2003-12-06 004 2003-12-08 table B ID DATE ------------------ 001 2003-12-12 003 2003-12-10 table C ID DATE ------------------ 001 2003-12-14 002 2003-12-16

  • 別テーブルからSELECTした値を持つ行を削除するSQLは?

    削除 SQL がわかりません。 SQL-1 SELECT id FROM table2 WHERE date_in IS NULL; これで取得したidを持つレコード(別テーブル)を削除したいのですが、 どうすれば組み合わさるのでしょうか? DELETE FROM table1 WHERE id=???

  • SQLの質問です。

    SQLの質問です。 SQL Server 2008 R2 を使っている初心者です。 下の2つのテーブルがあります。 1)売上情報 table_uriage ・uriage_id ・user_id ・uriage_date ・uriage_kingaku 2)入金情報 table_nyukin ・nyukin_id ・user_id ・nyukin_date ・nyukin_kingaku この2つのテーブルに対して、同じ期間を指定して、集計表(ユーザー毎の合計)を 作りたいと思っています。別々の表にするには何の問題もないのですが、 問題は2つのSQLの結果を1つの表にしたいのですが、SQLをどのように組んだらいいか わかりません。 具体的な表としては、 user_id uriage_total nyukin_total ======================================== 001 11111 22222 002 33333 44444 003 55555 66666 みたいな感じになればいいのです。 どなたか教えて下さい。 よろしくお願いいたします。

  • SQLでのデータ検索方法

    以下のようにデータが格納されている テーブルAがすでにあります。  id  in_time  out_time  1         11:10  1   10:30  1         10:15  3   09:50  1   09:30  1         09:00  1   08:30  2         08:10  1         07:50  2   07:40  1   07:30 ここでin_timeとout_timeの範囲が指定されたとき 範囲内でidごとにin_timeとout_timeがセットにな っているデータのみ抽出したいのです。 例えば in_time:7:00~10:20 out_time:8:00~11:30 と指定されたとき、検索結果を  id  in_time  out_time  1         10:15  1   09:30  1         09:00  1   08:30  2         08:10  2   07:40 と表示したいのです。 プログラムで1レコードずつ処理するしかない と思っているのですが、SQLで上記のような結果 を取得する方法はあるのでしょうか。 環境は、 RHEL 5 postgesql 8.1.9 です。

  • SQLのPRIMARY KEYの後のKEYについて

    SQLの超初心者です。 SQLのPRIMARY KEYの後のKEYについてご教授ください。m(__)m CREATE TABLE ***** (   shipping_id NOT NULL default 0,   order_date datetime NOT NULL default 0000-00-00 00:00:00,     ・     ・   PRIMARY KEY (shipping_id),   KEY order_date (order_date) ) の様に参考書に記載があるのですが、 KEY order_date (order_date) の部分の意味がわかりません。 どなたか詳しい方アドバイスお願いします。

  • SQL MIN句

    テーブルには複数の主キーがあり、そのうちの3つの主キーを元に 最も古い日付の情報を取得したいです。 同じデータが複数あるので、副問い合わせ(=)でエラーになると思ったのですが エラーにならずにすべてのデータが取得されてしまいます。 テーブル id name sex date1 1 'A' '男' 20120101 1 'A' '男' 20120101 2 'A' '女' 20120102 select * from table where date1 = (select min(date1) from table where id = 1 and name = 'A' and sex='男'); 下記のような情報を取得するには、SQLとして間違えておりますでしょうか。 ↓ id name sex date1 1 'A' '男' 20120101 1 'A' '男' 20120101 お分かりの方、ご教授頂けませんでしょうか。 以上、よろしくお願い致します。

  • SQLの結果が返ってこない

    PHP+mysqlで以下のようなSQL文で処理を行ったのですがデータが返ってきません。 $sql = 'SELECT * FROM books WHERE id=3'; $recordSet = mysql_query($sql); if(mysql_fetch_assoc($recordSet)){ while ($table = mysql_fetch_assoc($recordSet)) {        処理     } } mysqlの画面で SELECT * FROM books WHERE id=3 を入力してみるとしっかりと結果が返ってきます。 ちなみに1行目を、違うテーブルの $sql = 'SELECT * FROM podcast WHERE code=3 ORDER BY dcdate DESC LIMIT 0,3'; にしてみると、データが表示されます。 2日間かけてずっと試行錯誤してみたのですが、完全に行き詰ってしまったので、何か考えられる原因はありませんでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP