• ベストアンサー

(2)-SQL文の書き方を教えてください。

table項目:名称、日付、数量。 以上のtabelから以下のクエリーをつくりたいです: クエリー項目:名称、当日数量、当月数量。 日付の値は、フォーム上で指定する。 具体的に:フォーム上日付欄に2003/10/01と2003/10/30を指定し、実行すると、当日数量は、2003/10/30その日の合計数が出る。当月数量に指定された10/01から10/30までの数字の合計がでる。 今、片方だけ条件のSQL文を書けるですが、二つ条件のSQL文がとても難しい。 そうゆうSQL文を教えていただけませんか? よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.10

#5の回答のクエリが一発で求めるクエリなのですが、あいにく、accessでは、select ~ from (select ~) のように select文の入れ子が出来ないので、以下のようにクエリを2つに分割するしかありません。 まず、以下の当日数量ごと、当月数量ごとに集計するクエリを「Q1」として保存します。 -------------------------------------------------- select 名称, 0 as 当日数, sum(数量) as 当月数 from W where 日付 >= #2003/10/01# and 日付 <= #2003/10/31# group by 名称 UNION select 名称, sum(数量) as 当日数, 0 as 当月数 from W where 日付 = #2003/10/15# group by 名称 UNION select 名称, 0 as 当日数, 0 as 当月数 from W group by 名称; -------------------------------------------------- 上記クエリでは、 ・当日に該当する数量の集計 ・当月に該当する数量の集計 ・すべての名称の一覧(当日、当月のどちらにも該当しない名称を0として出力させる) の3つを生成します。 次に、当日数と当月数を1レコードにまとめる為の集計クエリを作ります。これが求めたい結果になります。 -------------------------------------------------- SELECT Q1.名称, Sum(Q1.当日数) AS 当日数量, Sum(Q1.当月数) AS 当月数量 FROM Q1 GROUP BY Q1.名称; -------------------------------------------------- #9の回答のように、当日数と当月数をunionではなくjoinで繋いで集計する方法もありますが、クエリが3つになって複雑、当日も当月も0の名称の物が出ないので、あまりお勧め出来ません。

Sikabu
質問者

お礼

やっと解決しました。どうもありがとうございます、またよろしくお願いいたします。

その他の回答 (9)

  • Silent-G
  • ベストアンサー率15% (2/13)
回答No.9

補足です。 他の方法としてクエリを2つ作って JOINする方法もあります。 クエリ1 SELECT 名称, Sum(数量) AS 当日合計 FROM テーブル WHERE 日付 = 終了日 GROUP BY 名称 クエリ2 SELECT 名称, Sum(数量) AS 当月数量 FROM テーブル WHERE 日付 >= 開始日 And 日付 <= 終了日 GROUP BY 名称 クエリ1とクエリ2を名称でJOINします。 結合プロパティを 「'クエリ2' の全レコードと 'クエリ1' の同じ結合フィールドのレコードだけを含める。」 にすれば、UNIONを使う場合と同じ結果で、 「両方のテーブルの結合フィールドが同じ行だけを含める。」 「'クエリ2' の全レコードと 'クエリ3' の同じ結合フィールドのレコードだけを含める。」 にすると、終了日に発生している名称のみ結合されます。 もちろん、サブクエリを使って、 SELECT A.名称, A.当日合計, B.当月数量 FROM ( SELECT 名称, Sum(数量) AS 当日合計 FROM テーブル WHERE 日付 = 終了日 GROUP BY 名称 ) AS A INNER JOIN ( SELECT 名称, Sum(数量) AS 当月数量 FROM テーブル WHERE 日付 >= 開始日 And 日付 <= 終了日 GROUP BY 名称 ) AS B ON A.名称 = B.名称; としても、いいでしょう。

Sikabu
質問者

お礼

ご回答をいただき、ありがとうございます。 この方法で、結果を出ました。 終了日に発生していない名称についての質問ですが: (1)当日数量は、0で表示できるでしょうか? (2)当月数量は、合計のまま。 (3)名称すべて表示される。 イメージとして: ============================================= 名称  当日数量  当月数量 --------------------------------------------- A 0 100 B 10 250 C 0 0 : : : : ご指導をお願いいたします。 :

  • Silent-G
  • ベストアンサー率15% (2/13)
回答No.8

もしかして、例文の"table"っていうテーブル名を そのまま使ってます? "table"は予約語なので無理やり使うとしたら、 "[table]"と記述しなければなりませんよ。

回答No.7

Accessソフトを使うといいでしょう。 一発でSQL文ができちゃいますよ。

Sikabu
質問者

補足

Accessソフトでもいいですが、教えてください。 table    :名称、日付、数量  →元              ↓ 求めクエリー:名称、当日数量、当月数量 よろしくお願いいたします。

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.6

#1及び#2です。 そう言うことですか、でしたら残念ですが一つのSQLで両方の値を同時に取得する事は出来ません。 論理的に、出力されるデータの件数が違いますね。ですから同時には取り出せません。 別々に分けるしか方法はないでしょう。 SELECT SUM(数量) FROM table WHERE 日付>=開始日 AND 日付<=終了日 で当月数量をとり、 SELECT 日付,SUM(数量) FROM table WHERE 日付>=開始日 AND 日付<=終了日 GROUP BY 日付 で、日付ごとの数量が取得できます。

Sikabu
質問者

補足

3回目ご回答をいただき、ありがとうございます。 以上の結果をひとつクエリーで集計したいです。(帳票の元になる。二つクエリーになると、帳票を作成するときに、また苦しくなりそう。)

  • Silent-G
  • ベストアンサー率15% (2/13)
回答No.5

当日数量のサマリーが最終日だけでいいのであれば、 以下でいけると思いますよ。 select 名称, sum(AAA) as 当日数量, sum(BBB) as 当月数量 from ( select 名称, 0 as AAA, sum(数量) as BBB from table where 日付 >= 開始日 and 日付 <= 終了日 group by 名称 union select 名称, sum(数量) as AAA, 0 as BBB from table where 日付 = 終了日 group by 名称 ) group by 名称 ※開始日、終了日はちゃんと日付で置き換えてくださいね。

Sikabu
質問者

お礼

ご回答ありがとうございます。 select 名称, 0 as AAA, sum(数量) as BBB from table where 日付 >= 開始日 and 日付 <= 終了日 group by 名称 union select 名称, sum(数量) as AAA, 0 as BBB from table where 日付 = 終了日 group by 名称 group by 名称; で数値を綺麗に集計しました。でも、頭の所に select 名称, sum(AAA) as 当日数量, sum(BBB) as 当月数量 from (以上文)を加えると、エラー(From構文のエラー)でました。原因がなんでしょうか?教えてください。

noname#5645
noname#5645
回答No.4

すみません。 肝心なことをわすれてますね。 SELECT (SELECT SUM(数量) FROM table WHERE 日付 = 2003/10/30 ), (SELECT SUM(数量) FROM table WHERE 日付>=2003/10/01 AND 日付<=2003/10/30 ) FROM TABLE こんな感じでイケるんではないかと・・・。

Sikabu
質問者

補足

ご回答ありがとうございます。この方法でクエリーのタイトルができたですが、数値のほうが失敗した。

noname#5645
noname#5645
回答No.3

こんばんは。 あくまでもたとえばですが、サブセレクトしてこんな風にしてやることも出来ますよ。 select distinct (select count(*) from user where Select_priv = 'N' ) , (select count(*) from user where Select_priv = 'Y' ) from user ****************** +------------------------------------------------------+------------------------------------------------------+ | 2 | 2 | +------------------------------------------------------+------------------------------------------------------+ 1 row in set (0.02 sec) とりあえず、mysqlで試してみてあります。 VBってよくわからないので、まったく自信なしです。

Sikabu
質問者

補足

ご回答、ありがとうございます。理解できませんでした。

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.2

いやぁ~、そのまんまですよ。 SELECT SUM(当日数量),SUM(当日数量) FROM table WHERE 日付>=2003/10/01 AND 日付<=2003/10/30 でいいはずです。 この場合、日付でヒットするデータの当日数量と当月数量の合計が取得できます。もし他に条件があるのなら、考え直さなきゃいけませんけどね。

Sikabu
質問者

補足

すみません、こちらの説明が悪いですが。 元table: 名称、日付、数量  3項目しかないです。 作ってほしい項目は、名称、当日数量の合計、当月数量の合計。 教えてもらった方法で、当日数量の合計と当月数量の合計が同じ数字になる。 SELECT SUM(当日数量),SUM(当月数量) FROM table WHERE 日付>=2003/10/01 AND 日付<=2003/10/30 だと、当月の数量の合計しか得られない。当日数量に対する制約条件は、ないです。 何回試したですが、当日数量の合計を得られませんでした。お願いいたします。

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.1

MS-ACCESSなら SELECT SUM(当月数量) FROM table WHERE 日付>=2003/10/01 AND 日付<=2003/10/30 か SELECT SUM(当月数量) FROM table WHERE 日付 BETWEEN 2003/10/01 AND 2003/10/30 と言う風にどちらでも出来ると思います。

Sikabu
質問者

補足

ご回答ありがとうございます。 当日数量と当月数量のSQL文を書けるですが、 SELECT SUM(当日数量) FROM table WHERE 日付>=2003/10/01 AND 日付<=2003/10/30 SELECT SUM(当月数量) FROM table WHERE 日付>=2003/10/01 AND 日付<=2003/10/30 ほしいSQL文: SELECT SUM(当日数量),SUM(当日数量) FROM table ??? この二つ条件(当日数量と当月数量)を満たすSQLを書けないです。ご指導をお願いいたします。

関連するQ&A