- ベストアンサー
(2)-SQL文の書き方を教えてください。
table項目:名称、日付、数量。 以上のtabelから以下のクエリーをつくりたいです: クエリー項目:名称、当日数量、当月数量。 日付の値は、フォーム上で指定する。 具体的に:フォーム上日付欄に2003/10/01と2003/10/30を指定し、実行すると、当日数量は、2003/10/30その日の合計数が出る。当月数量に指定された10/01から10/30までの数字の合計がでる。 今、片方だけ条件のSQL文を書けるですが、二つ条件のSQL文がとても難しい。 そうゆうSQL文を教えていただけませんか? よろしくお願いいたします。
- みんなの回答 (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の名称の物が出ないので、あまりお勧め出来ません。
その他の回答 (9)
- Silent-G
- ベストアンサー率15% (2/13)
補足です。 他の方法としてクエリを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.名称; としても、いいでしょう。
お礼
ご回答をいただき、ありがとうございます。 この方法で、結果を出ました。 終了日に発生していない名称についての質問ですが: (1)当日数量は、0で表示できるでしょうか? (2)当月数量は、合計のまま。 (3)名称すべて表示される。 イメージとして: ============================================= 名称 当日数量 当月数量 --------------------------------------------- A 0 100 B 10 250 C 0 0 : : : : ご指導をお願いいたします。 :
- Silent-G
- ベストアンサー率15% (2/13)
もしかして、例文の"table"っていうテーブル名を そのまま使ってます? "table"は予約語なので無理やり使うとしたら、 "[table]"と記述しなければなりませんよ。
- regacy_japan
- ベストアンサー率22% (4/18)
Accessソフトを使うといいでしょう。 一発でSQL文ができちゃいますよ。
補足
Accessソフトでもいいですが、教えてください。 table :名称、日付、数量 →元 ↓ 求めクエリー:名称、当日数量、当月数量 よろしくお願いいたします。
- PAPA0427
- ベストアンサー率22% (559/2488)
#1及び#2です。 そう言うことですか、でしたら残念ですが一つのSQLで両方の値を同時に取得する事は出来ません。 論理的に、出力されるデータの件数が違いますね。ですから同時には取り出せません。 別々に分けるしか方法はないでしょう。 SELECT SUM(数量) FROM table WHERE 日付>=開始日 AND 日付<=終了日 で当月数量をとり、 SELECT 日付,SUM(数量) FROM table WHERE 日付>=開始日 AND 日付<=終了日 GROUP BY 日付 で、日付ごとの数量が取得できます。
補足
3回目ご回答をいただき、ありがとうございます。 以上の結果をひとつクエリーで集計したいです。(帳票の元になる。二つクエリーになると、帳票を作成するときに、また苦しくなりそう。)
- Silent-G
- ベストアンサー率15% (2/13)
当日数量のサマリーが最終日だけでいいのであれば、 以下でいけると思いますよ。 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 名称 ※開始日、終了日はちゃんと日付で置き換えてくださいね。
お礼
ご回答ありがとうございます。 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構文のエラー)でました。原因がなんでしょうか?教えてください。
すみません。 肝心なことをわすれてますね。 SELECT (SELECT SUM(数量) FROM table WHERE 日付 = 2003/10/30 ), (SELECT SUM(数量) FROM table WHERE 日付>=2003/10/01 AND 日付<=2003/10/30 ) FROM TABLE こんな感じでイケるんではないかと・・・。
補足
ご回答ありがとうございます。この方法でクエリーのタイトルができたですが、数値のほうが失敗した。
こんばんは。 あくまでもたとえばですが、サブセレクトしてこんな風にしてやることも出来ますよ。 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ってよくわからないので、まったく自信なしです。
補足
ご回答、ありがとうございます。理解できませんでした。
- PAPA0427
- ベストアンサー率22% (559/2488)
いやぁ~、そのまんまですよ。 SELECT SUM(当日数量),SUM(当日数量) FROM table WHERE 日付>=2003/10/01 AND 日付<=2003/10/30 でいいはずです。 この場合、日付でヒットするデータの当日数量と当月数量の合計が取得できます。もし他に条件があるのなら、考え直さなきゃいけませんけどね。
補足
すみません、こちらの説明が悪いですが。 元table: 名称、日付、数量 3項目しかないです。 作ってほしい項目は、名称、当日数量の合計、当月数量の合計。 教えてもらった方法で、当日数量の合計と当月数量の合計が同じ数字になる。 SELECT SUM(当日数量),SUM(当月数量) FROM table WHERE 日付>=2003/10/01 AND 日付<=2003/10/30 だと、当月の数量の合計しか得られない。当日数量に対する制約条件は、ないです。 何回試したですが、当日数量の合計を得られませんでした。お願いいたします。
- PAPA0427
- ベストアンサー率22% (559/2488)
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 と言う風にどちらでも出来ると思います。
補足
ご回答ありがとうございます。 当日数量と当月数量の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を書けないです。ご指導をお願いいたします。
お礼
やっと解決しました。どうもありがとうございます、またよろしくお願いいたします。