- ベストアンサー
- 暇なときにでも
ACCESS での LEFT JOIN 時の WHERE 句の使用について
以下のテーブル1、テーブル2で、 テーブル2のDATE2が、テーブル1のDATE以前になっている VOL2を集計したいと考えています。 テーブル1 CODE DATE VOL --------------------------- a 20080601 100 a 20080602 100 a 20080603 100 テーブル2 CODE DATE2 VOL2 ------------------------ a 20080602 50 a 20080603 50 希望する結果のイメージ CODE DATE VOL VOL2 --------------------------------------- a 20080601 100 0 a 20080602 100 50 a 20080603 100 100 以下のSQLを考えましたが、DATE以前のDATE2を持たない場合、 テーブル1の行が表示されませんでした。 SQL文 SELECT t1.CODE, t1.DATE, t1.VOL , Sum(t2.VOL2) AS VOL2の合計 FROM テーブル1 as t LEFT JOIN テーブル2 as t2 ON t1.CODE = t2.CODE WHERE t1.DATE >= t2.DATE2 GROUP BY t1.CODE, t1.DATE, t1.VOL 結果 CODE CDATE VOL VOL2の合計 -------------------------------------- a 20080602 100 50 a 20080603 100 100 SQL文中にある WHERE t1.DATE >= t2.DATE2 が原因しているのではと考えています。 しかし、どのようにしたらよいのかがわかりません。 どなたか、ご教授をお願いします。
- tokonoko
- お礼率53% (21/39)
- 回答数2
- 閲覧数1583
- ありがとう数3
質問者が選んだベストアンサー
- ベストアンサー
- 回答No.2
- CHRONOS_0
- ベストアンサー率54% (457/838)
SELECT テーブル1.CODE, テーブル1.DATE, テーブル1.VOL, Sum(IIf([DATE]>=[DATE2],[VOL2],0)) AS VOL2の合計 FROM テーブル1 LEFT JOIN テーブル2 ON テーブル1.CODE = テーブル2.CODE GROUP BY テーブル1.CODE, テーブル1.DATE, テーブル1.VOL;
関連するQ&A
- 少し複雑な left join
まだデーターベースを独学で始めて数ヶ月の初心者です。 以下(3行目のleft join)の記述では動かないのですが、どのように 記述したらよいのでしょうか? やりたい内容は3行目にあるようにbookedというテーブルの中のdateが 2013-06-05だけ抽出した形のテーブルを、timeTplというテーブルとleft join させたいです。 1 "select * 2 from 3 timeTpl as t left join (SELECT * FROM booked where date ="2013-06-05") as b 4 on 5 t.start >= b.startTime and t.start < b.finishTime || 6 t.finish > b.startTime and t.finish <= b.finishTime 7 where 8 t.time > 9 (select start 10 from class as c left join member as m 11 on c.className = m.class 12 where m.name = '$name') 13 ) 14 "; よろしくお願いします。
- 締切済み
- MySQL
- LEFT JOINの条件式で=’’を使用した場合
以下のSQLを実行した場合、レコードを1件取得して欲しいのですが、 なぜか上手く取得できません。 ご存知の方がいらっしゃいましたら、教えてください。 -- SQL1 --------------------------------------------------- select MAIN.MAIN_NAME, nvl(SUB1.CODE is NULL, 0) as SUB_CODE1, nvl(SUB2.CODE is NULL, 0) as SUB_CODE2 from MAIN_TABLE MAIN left join SUB_TABLE SUB1 on MAIN.CODE = SUB1.CODE and SUB1.ZYOUKEN = '1' (1) left join SUB_TABLE SUB2 on MAIN.CODE = SUB2.CODE and SUB2.ZYOUKEN = '' (2) where MAIN.CODE = 'XXX' ----------------------------------------------------------- 質問1. どうも、(2)の部分を空文字(?)ではなく何か値を入れると正常に1件 取得できるようなのですが、なぜ外部結合しているにもかかわらず 0件になってしまうのかが良く分かりません。 質問2. やはり条件に空文字を使用するのはよろしくないでしょうか? ※補足 念のため、以下のSQLを実行したところ、こちらは問題なく1件取得 できているので、抽出条件は間違っていないです。 -- SQL2 --------------------------------------------------- select MAIN.MAIN_NAME from MAIN_TABLE MAIN where MAIN.CODE = 'XXX' ----------------------------------------------------------- 以上です。宜しくお願いします。
- ベストアンサー
- Oracle
- Access 2000 サブクエリとJOIN
Access2000でSQLを発行したのですが、 エラーが出てしまいます。 テーブル(仮にtest1、test2)があるとして test1 ------------------------- 主キー | 番号|項目 1| 1|りんご 2| 2|ぶどう 3| 3|みかん 4| 4|いちご test2 ----------------------------- 一つ目|二つ目| 1| 2| 4| 1| ・・・略 test2には2つのフィールドがあり、1,2,3,4を既定値として 入れるようにしています。 やりたいとこは、test2をグループ化し「一つ目」と「二つ目」 の規定値の個数(1、2、3、4)それぞれのカウントを求めたいのです。 一つのフィールドの場合は、 select * from test1 join test2 test1.番号=test2.一つ目 group by test1.番号 で求められたのですが、二つのフィールドをグループ化した際、 一つ目のフィールドと同じ個数が二つ目のフィールドにコピーされてしまうのです。 ですので、FROM句でサブクエリを結合しその中で、 group化したものを、いくつかのサブクエリと結合し てみたのですが、うまくいきませんでした。 select cnt1.一つ目,cnt2.二つ目 from (select * from test1 left join test2 on test1.番号=test2.一つ目group by test1.番号) as cnt1 left join (select * from test1 left join test2 on test1.番号=test2.二つ目group by test1.番号) as cnt2 on cnt1.番号=cnt2.番号 といった形で作ってみました。 エイリアスをつけてしまった時点でエラーが出ているので、 どうにもしようがありません。 申し訳ないのですが、ご教授のほどよろしくお願いいたします。
- ベストアンサー
- その他(データベース)
その他の回答 (1)
- 回答No.1
- keirika
- ベストアンサー率42% (279/658)
SELECT t1.CODE, t1.DATE, t1.VOL , Sum(t2.VOL2) AS VOL2の合計 FROM テーブル1 as t1 LEFT JOIN テーブル2 as t2 ON t1.CODE = t2.CODE AND t1.DATE = t2.DATE2 GROUP BY t1.CODE, t1.DATE, t1.VOL でどうでしょうか
質問者からのお礼
実行したところ結果が以下のようになり 上手くいきませんでした。 CODE DATE VOL VOL2の合計 ----------------------------------------- a 20080601 100 a 20080602 100 50 a 20080603 100 50 No.2の方の回答にて解決いたしました。 回答ありがとうございました。
関連するQ&A
- 複数のテーブルに対してのleft join
前回他の方が質問していますが、、、 T1、T2、T3、T4がありまして T1が軸のテーブルです。 その場合 select T1.a,T2.b,T3.c from T1,T2,T3 left join T4 on T1.x = T2.x and T2.xx = T3.xx and T2.xxx = T4.xxx where T4.x is null というふうなSQLを発行しようとしたのです。 しかし「onが無効」と怒られました。 ご存知の方教えてください。 HPなどご存知の方お願いいたします。 DB2/UDBです。
- ベストアンサー
- その他(データベース)
- ACCESSでパススルークエリにパラメータを使用したい
毎度お世話になっております。 WindowsXP、Access2003、SQLServer2000を使用しております。 ADOでSQLServerからデータを抽出したいのですが、 パラメータを使用したいと考えております。 SELECT CODE FROM テーブル1 WHERE CODE = ? とし adoCmd.CommandTimeout = 0 With adoCmd .CommandText = strSQL .CommandType = adCmdUnknown .Prepared = False .Parameters.Refresh End With adoCmd.Parameters(0).Value = InputBox(Trim(strBuf)) Set adoSet = adoCmd.Execute とすることで動作しました。 しかしSQL文を下記に変更したところエラーになりました。 SELECT t1.CODE FROM (SELECT CODE FROM テーブル1 WHERE CODE = ? ) as t1 LEFT JOIN (SELECT CODE FROM テーブル2 WHERE CODE = ? ) as t2 ON t1.CODE = t2.CODE のようにすると、 .Parameters.Refresh の部分で 実行時エラー -21474672595(80004005) 構文エラーまたはアクセス違反です。 となってしまいました。 2つの?の内、片方を定数に、片方を?にしてもエラーになりました。 ?を両方とも定数にすれば実行できました。 JOIN句がある場合に?を使ってはいけないのでしょうか。 何がエラーの原因かわからない状態です。 ご教授お願いいたします。
- ベストアンサー
- その他(データベース)
- Delphiでサブクエリは可能か
Delphiいやプログラム初心者のものなのですが 困っていますのでどなたか回答願えればと思っております。 Delphiではサブクエリを発行することはできないのでしょうか? 色々試してみてるのですが、「キーワードが無効です'('」のような エラーが出てしまいます。 例えば以下のような場合 SELECT 日付,商品No,商品名,SUM(仕入数) AS 仕入数,SUM(売上数) AS 売上数 FROM ( SELECT siire_date AS 日付,goods_code AS 商品コード,goods_name AS 商品名,SUM(vol) AS 仕入数,0 AS 売上数 FROM SiireData WHERE siire_date >= '2006/05/01' AND siire_date < '2006/06/01' GROUP BY siire_date ,goods_code ,goods_name UNION ALL SELECT delivery_date AS 日付,goods_code AS 商品コード,goods_name AS 商品名,0 AS 仕入数,SUM(vol) AS 売上数 FROM URIAGEDATA WHERE delivery_date >= '2006/05/01' AND delivery_date < '2006/06/01' GROUP BY delivery_date ,goods_code ,goods_name ) サブクエリが無理であれば、一時テーブルを利用しようと考えているのですが・・・わかりません。 Delphi Ver5.0を使って開発しています。 DBはDatabaseDesktop?を利用 どちらの回答でも結構ですのでご教授よろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- inner joinをすると数がおかしくなります
SQLのinner joinについてお教え下さい。環境はWin 7 MYQL5です。 t1テーブルのデータ ID,在庫 001,22 t2テーブルのデータ ID,出庫 001,17 001,3 SELECT Sum(t1.stock) AS `在庫` FROM t1 where id = '001' 上記SQLの結果は22と表示されます。 SELECT Sum(t1.stock) AS `在庫` FROM t1 INNER JOIN t2 on t1.id = t2.id where id = '001' とやると、結果が44になってしまいます。 なぜそんな結果になってしまうのでしょうか? 結果はt1.stockは在庫22なので、22と表示するようにしたいです。 よろしくお願いいたします。
- ベストアンサー
- MySQL
- WHERE句はJOIN結合前結合後どちらに効くのか
以下の2つのSQLを比較してどちらがパフォーマンスが良いでしょうか。 先に抽出して結合した方が良いと昔聞いた事がありましたが 記憶があいまいになってしまいました。 (1) SELECT * FROM A JOIN B ON A.*** = B.*** WHERE A.*** = '0001' (2) SELECT * FROM (SELECT * FROM A WHERE A.*** = '0001') AS A JOIN B ON A.*** = B.***
- ベストアンサー
- Oracle
- MySQLでLEFT JOIN
MySQL4.0.26でテーブルの左外部結合がしたいです。 左テーブルAと 右テーブルBをWHERE句で抽出したもの を結合することはできないのでしょうか? 考えた以下の式ではエラーが出てしまいます。 SELECT * FROM A LEFT JOIN ( SELECT * B WHERE id = 1 ) AS B2 ON A.id = B2.id
- ベストアンサー
- MySQL
- Accessで差分取得する方法は? LEFT JOIN エラー
Accessで差分抽出するSQLを教えてください。 【旧テーブル】t1 id, class, number, value 1, "a", 1, "aka" 2, "a", 2, "aki" 3, "a", 3, "aku" 【新テーブル】t2 id, class, number, value 1, "a", 1, "aka" 2, "a", 2, "更新" 3, "a", 3, "aku" 4, "a", 4, "新規" 5, "b", 1, "新規" 【ダメだったクエリ】 SELECT t2.* FROM t2 INNER JOIN t1 WHERE t1.class IS NULL OR t1.number IS NULL 【望む結果】 4, "a", 4, "新規" 5, "b", 1, "新規" *列 id は各テーブルの主キーですが、新旧テーブル間の関連はありません(リレーションではありません)。
- ベストアンサー
- オフィス系ソフト
- サブクエリの使い方
Table t1には t1code|t1type ------------------ 花子|1 太郎|1 一郎|2 次郎|2 五郎|2 Table t2には t2code|date ----------------- 太郎|2012-05-30 太郎|2012-05-30 花子|2012-05-10 花子|2012-05-10 次郎|2012-03-20 五郎|2012-04-10 一郎|2012-03-01 と登録されている場合に t1type毎に一番新しいdateをもつt2codeを抽出したいのです。 そこで、 select t2code,max(date) from t1 inner join t2 on t1code = t2code where (t2code,date) in (select t2code,max(date) as d from t2 group by t2code) group by t1type としたところ、 +--------+------------+ | t2code | max(date) | +--------+------------+ | 太郎 | 2012-05-30 | | 次郎 | 2012-04-10 | +--------+------------+ となります。 本来は、次郎→五郎になってほしいのですが、 どこが悪いのでしょうか? よろしくお願いします。
- ベストアンサー
- MySQL
- LEFT JOIN について
table a ------ user_id ------ user1 user2 user3 user4 user5 ------ table b --------------- user_id role_id --------------- user1 role1 user2 role1 user3 role1 user2 role2 user4 role2 --------------- とします。 1つのSQL文で、a のすべてのユーザそれぞれが指定role_id に属しているかどうかを検索したいです。 例えば、すべてのユーザそれぞれが role1 に属しているかどうかを検索します。 欲しい結果は以下の通りです。 ------------ user1 true user2 true user3 true user4 false user5 false ------------ LEFT JOIN だと思いますが、うまくいきません。 SELECT a.user_id, b.role_id FROM a LEFT JOIN b ON a.user_id = b.user_id WHERE b.role_id='role1'; 結果は以下になります。 ------------ user1 role1 user2 role1 user3 role1 ------------ #Whereで絞って、当然の結果です SQLをどうかければよいでしょうか。 よろしくお願いします。
- ベストアンサー
- MySQL
- SELECTした合計値をそのまま割り算したい
こういうSQL文(MySQL)って無効なのでしょうか? SELECT NAMECODE, SUM(DATA1) AS D1, SUM(DATA2) AS D2, D1/D2 AS D3 FROM MYTABLE GROUP BY NAMECODE DATA1をNAMECODE毎に合計(D1とする) DATA2をNAMECODE毎に合計(D2とする) D1をD2で除した値をD3とする。
- ベストアンサー
- MySQL
質問者からのお礼
実行したところ、希望通りの結果になりました。 大変助かりました。 ありがとうございました。