• 締切済み
  • 困ってます

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の組立て方法を教えて下さい。 よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数4
  • 閲覧数317
  • ありがとう数0

みんなの回答

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

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

共感・感謝の気持ちを伝えよう!

関連する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 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について質問します

    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点について教えて下さい。 よろしくお願いします。

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

参考までに。 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) 考え方は示したので参考にしてください。

共感・感謝の気持ちを伝えよう!

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

昨日の者です。ごめんなさい 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を教えて下さい

    下記の「テーブル1」から、 テーブル1 商品名|価格 ------------ AAAAAA|1000 AAAAAA|1200 AAAAAA|1500 BBBBBB|2100 BBBBBB|2600 CCCCCC|2000 DDDDDD|3000 EEEEEE|6000 EEEEEE|6000 EEEEEE|7000 EEEEEE|7500 下記のように出力するにはどのようにSQLを書いたらいいでしょうか。 商品名|価格|通番 ------------------ AAAAAA|1000|1 AAAAAA|1200|2 AAAAAA|1500|3 BBBBBB|2100|1 BBBBBB|2600|2 CCCCCC|2000|1 DDDDDD|3000|1 EEEEEE|6000|1 EEEEEE|6000|2 EEEEEE|7000|3 EEEEEE|7500|4 要するに、「商品名」ごとに、「価格」で昇順にソートして「通番」をつけたいのです。 なお、上記「EEEEEE」には価格が6000のレコードが2つありますが、「通番」はそれぞれ1と2をふっています。 このように、価格が同じレコードがある場合にもカウントアップさせて通番を付与したいです。 ご回答よろしくお願い致します。

  • SELECT結果から重複行を除く方法

    下記のようなテーブルから重複なくSELECTしたいと考えています。 temp_table ------------------------ | id | name_1 | name_2 | ------------------------ | 1 | aaaaaa | bbbbbb | | 2 | cccccc | dddddd | | 3 | cccccc | dddddd | | 4 | aaaaaa | bbbbbb | | 5 | cccccc | jjjjjj | ------------------------ SELECT結果が下記の要になるのが理想です。 DISTINCTを利用して SELECT DISTINCT id, name_1 || name_2 AS name FROM temp_tableとしましたがダメでした。 --------------------- | id | name     | --------------------- | 3 | ccccccdddddd | | 4 | aaaaaabbbbbb | | 5 | ccccccjjjjjj | --------------------- よい方法をご存じの方、宜しくお願いします。

  • 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

  • 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の結合条件について

    SQLの結合条件について ・table_A ID | ATAI 01 | AAA 01 | XXX 02 | ABC 03 | DEF table_B ID | ATAI 01 | 不要 02 | 必要 03 | 必要 04 | 不要 上記のようなテーブルAとBがあるとします。 やりたいこと 1.テーブルAに存在するIDをBのIDから抽出 2.テーブルAの「ATAI」の値が’AAA’のIDは抽出対象から外す。 ※テーブルAの01IDに’AAA’と’XXX’がありますが、Bの抽出対象から外したい。 2.がうまくいきません。 select B.ID from table_A A,table_B B where A.ID = B.ID 上記のSQLに2.の条件を足して、結果を02と03にしたいです。 ※CASEは使わずにお願いします。

  • これを抽出するSQLを教えてください

    どういうSQLを書けばこれが実現出来るのか分からないので教えて下さい。 テーブル名 f_table というテーブルがあります。 このテーブルには、f_id,u_id,day(日付)という三つの列があり、下記のようにデータが入っているとします。 f_id  u_id    day   1    1   2007/3/8 2    2   2008/1/2 3    2   2008/1/10 4    1   2007/2/12 このf_tableから、各u_idで一番日付の新しいf_idを抽出する(この表の場合f_idの1と3が抽出される)にはどういうSQLで出来るのでしょうか? ※実際の表ではu_idに入っている数字の種類は1と2だけではなく、もっと沢山あります。 ご回答よろしくお願いします。

  • SQL文で教えていただきたいのですが・・・

    現在、Windows版のMySQLを使っており、 webのサービスでログ解析を行っているのですが、初心者の私ではどうにもならなくなったのでご教授ください。 Table「info」:ユーザー登録DB | id | varchar(16) |←登録ID | name | varchar(50) |←登録名 | mail | varchar(50) |←登録メールアドレス Table「log」:ログインのログをとるテーブル | date | int(11) |←ログインした時間 | id | varchar(16) |←ログインしたID と言うデータベースがあり、登録ポリシーは「一つのメールアドレスで複数のIDを取得可能」というものです。 したがって、 aaa@bbb.com と言うメールアドレスで登録したIDは複数存在し、 AAA BBB CCC と言う3つをもっていることもあります。 ところが、ログはID単位でとっているため、メールアドレスが同じにもかかわらずこうなります。 +------------+-----+ | date | id | +------------+-----+ | 1068019110 | AAA | | 1068019200 | BBB | | 1068019209 | CCC | | 1068019210 | AAA | | 1068019213 | BBB | +------------+-----+ これでは、ログの集計をしても1人がログインした数を集計できません。メールアドレス別のログをとりたいのです。 単純に表にするのは select log.id, mail from log_login inner join info on info.id=log_login.id where mail='***@***.com' order by date; にすることでなんとかできたのですが、別に表にする必要はなく、アクセス数だけを知りたいのです。 どうやったらいいのでしょうか???

  • 一つのSQLで実行できるでしょうか?

    sqliteで質問です。 今、以下のようなテーブル(table1)があったとします。 uid | date | comment 010 | 1211 | AAAAA 011 | 1211 | BBBBB 010 | 1220 | CCCCCC 011 | 1220 | DDDDDD このとき、1行目と4行目を取得や削除するようなSQLを一つで記述することは可能でしょうか? イメージてきには、 select * from table1 where {((uid = 010) and (date = 1211)), ((uid = 011) and (date = 1220))} みたいな感じにです。 つまり、where句の組み合わせを複数書いて一つのSQLで実行したいのです。 恐れ入りますが、よろしくお願いします。

  • SQLでご助言いただきたく。

    テーブル名:AAA カラム: 'fname' ,ename テーブル名:BBB カラム: "id",fcode テーブル名:CCC カラム : "id",'fname',date 上記三つのテーブルAAA,BBB,CCCにそれぞれカラムがあります。 最終的に ename fcode date の3カラムを結合した状態でSELECTします。 ただし、条件として AAAのfname列とCCCのfname列を紐付けし、尚且つ BBBのid列とCCCのid列を紐付けし、尚且つ CCCのdate列が2012-10-31以上のものだけをSELECTしたいです。 上記を踏まえて下記二点ご質問致します。 (1)私が考えたSQL文は select a.ename ,bc.fcode ,bc.date from AAA a , (select b.fcode ,c.fname ,c.date from BBB b , CCC c where b.id = c.id and c.date >= '2012-10-31' ) bc where a.fname = bc.fname ; です。先にBBBとCCCから紐付けしその結果とAAAを紐付けしています。 このSQL文で間違いがないかどうか判定していただきたく。 (2)もっとスマートな書き方(短く書けるなど)がありましたら、 ご助言いただきたく。 ちなみにデータベースはオラクル仕様です。 宜しくお願い致します。

  • MySQLのSQLについて

    テーブル名:table ------------------------------------ 初回アクセス,日付,名前,顧客ID,URL Y,2017/01/01,Aさん,001,http://aaa.jp NULL,2017/01/01,Aさん,001,http://aaa.jp/test.php NULL,2017/01/01,Aさん,001,http://aaa.jp/blog/ Y,2017/01/02,Bさん,002,http://aaa.jp NULL,2017/01/02,Bさん,002,http://aaa.jp/test.php NULL,2017/01/02,Bさん,002,http://aaa.jp NULL,2017/01/02,Bさん,002,http://aaa.jp/blog/ Y,2017/01/03,Cさん,003,http://aaa.jp/test.php NULL,2017/01/03,Cさん,003,http://aaa.jp ------------------------------------ 上記の様なテーブルを作りアクセスデータを蓄積しています。 これらを1ページ目のランキング、2ページ目のランキング、3ページ目のランキングとつくりたいです。 例えば、 ------------------------------------ SQL ------------------------------------ SELECT `table`.`URL`, COUNT( `table`.`URL`) AS `count` FROM `table` WHERE `table`.`初回アクセス` = 'Y' GROUP BY `table`.`URL`; ------------------------------------ 結果 ------------------------------------ URL,count http://aaa.jp,2 http://aaa.jp/test.php,1 1ページ目のランキングは上記SQLで作れるのですが、2ページ目以降のランキングの作り方が分かりません。 何か良い方法等ありませんか?

    • ベストアンサー
    • MySQL