重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

table項目:名称、日付、数量。
以上のtabelから以下のクエリーをつくりたいです:

クエリー項目:名称、当日数量、当月数量。
日付の値は、フォーム上で指定する。

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

A 回答 (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の名称の物が出ないので、あまりお勧め出来ません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/11/04 13:30

補足です。


他の方法としてクエリを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.名称;
としても、いいでしょう。
    • good
    • 0
この回答へのお礼

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

ご指導をお願いいたします。
:

お礼日時:2003/11/04 06:51

もしかして、例文の"table"っていうテーブル名を


そのまま使ってます?

"table"は予約語なので無理やり使うとしたら、
"[table]"と記述しなければなりませんよ。
    • good
    • 0

Accessソフトを使うといいでしょう。



一発でSQL文ができちゃいますよ。

この回答への補足

Accessソフトでもいいですが、教えてください。

table    :名称、日付、数量  →元
             ↓
求めクエリー:名称、当日数量、当月数量

よろしくお願いいたします。

補足日時:2003/11/03 21:01
    • good
    • 0

#1及び#2です。



そう言うことですか、でしたら残念ですが一つのSQLで両方の値を同時に取得する事は出来ません。

論理的に、出力されるデータの件数が違いますね。ですから同時には取り出せません。

別々に分けるしか方法はないでしょう。

SELECT SUM(数量) FROM table WHERE 日付>=開始日 AND 日付<=終了日
で当月数量をとり、
SELECT 日付,SUM(数量) FROM table WHERE 日付>=開始日 AND 日付<=終了日 GROUP BY 日付
で、日付ごとの数量が取得できます。

この回答への補足

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

補足日時:2003/11/03 20:57
    • good
    • 0

当日数量のサマリーが最終日だけでいいのであれば、


以下でいけると思いますよ。

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 名称

※開始日、終了日はちゃんと日付で置き換えてくださいね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
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構文のエラー)でました。原因がなんでしょうか?教えてください。

お礼日時:2003/11/03 20:56

すみません。


肝心なことをわすれてますね。

SELECT
(SELECT SUM(数量)
FROM table
WHERE 日付 = 2003/10/30
),
(SELECT SUM(数量)
FROM table
WHERE 日付>=2003/10/01 AND 日付<=2003/10/30
)
FROM TABLE

こんな感じでイケるんではないかと・・・。

この回答への補足

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

補足日時:2003/11/03 20:50
    • good
    • 0

こんばんは。


あくまでもたとえばですが、サブセレクトしてこんな風にしてやることも出来ますよ。

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ってよくわからないので、まったく自信なしです。

この回答への補足

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

補足日時:2003/11/03 20:48
    • good
    • 0

いやぁ~、そのまんまですよ。


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
だと、当月の数量の合計しか得られない。当日数量に対する制約条件は、ないです。

何回試したですが、当日数量の合計を得られませんでした。お願いいたします。

補足日時:2003/11/01 18:52
    • good
    • 0

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を書けないです。ご指導をお願いいたします。

補足日時:2003/11/01 18:27
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!