以下のSQLが通りません。(行番号が飛んでいるのはコメントアウトしています)17行目から24行目のサブクエリは、それ単独では動きます。<メイン=Yes>というのは一つの相手先に対して複数の担当者が存在する場合、メインとなる担当者をこの処理上作らなければいけないため存在しています。(最終的に担当者別の粗利を計算してエクセルに吐き出すため

わかる方ご教授おねがいします。

1 SQL = ""
2 SQL = SQL & "select"
3 SQL = SQL & " 伝票データ.相手先コード"
4 SQL = SQL & ",伝票データ.相手先名"
14 SQL = SQL & ",担当コースマスタ.担当者"
15 SQL = SQL & " from (select * from 伝票データ"
16 SQL = SQL & " left join"
17 SQL = SQL & " (select 担当者,コード from 担当コースデータ"
18 SQL = SQL & " where コード in"
19 SQL = SQL & " (select コード"
20 SQL = SQL & " from 担当コースデータ"
21 SQL = SQL & " where 削除=No"
22 SQL = SQL & " and メイン=Yes"
23 SQL = SQL & " group by コード having count(*)=1)"
24 SQL = SQL & " as 担当コースデータ)"
25 SQL = SQL & " on 伝票データ.相手先コード=担当コースデータ.コード) as 伝票データ"

回答の条件
  • 1人2回まで
  • 登録:2008/08/25 15:45:15
  • 終了:2008/08/26 10:01:01

回答(3件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402008/08/25 15:48:26

ポイント10pt

エラーメッセージぐらいは書いてほしいのと、SQL のみ提示の方が見やすいと思うのだけど。


24行目のかっこの後ろに「AS」がいりませんか?

id:uuuu_mmmm0120

エラーメッセージはfrom文以下が構文エラーです。ちなみに24行目の後ろにasはいりませんでしたが、24行目のカッコの位置を一番後ろじゃなくて先頭にもっていく必要がありました。ご指摘ありがとうございます。

2008/08/26 10:00:00
id:sect No.2

sect回答回数5ベストアンサー獲得回数02008/08/25 16:25:40

ポイント50pt

DBMSも発生しているエラーも解りませんが、

全体のfrom句の対象テーブルはサブクエリとなっていますが、25行目で名称を「伝票データ」としています。

14行目で「担当コースマスタ.担当者」としていますが、担当コースマスタが無いのでエラーになっているのでは?

この場合、

「担当コースマスタ.担当者」

ではなく、

「伝票データ.担当者」

となるような気がしますがいかがでしょうか。

id:uuuu_mmmm0120

その通りにやったところ解決しました。ありがとうございます!

2008/08/26 09:56:18
id:kn1967 No.3

kn1967回答回数2915ベストアンサー獲得回数3012008/08/25 23:43:09

ポイント20pt

Excel という言葉と変数名や式の形式などからAccessVBAだと推測してお応えしますがよろしいでしょうか。

まずは26 行目に

Debug.Print SQL

といれて動かしてイミディエイトウィンドウ(Ctrl+Gで出てきます)に変数の内容を出力。


出力されたものは長い一行になっているのでメモ帳にコピー&ペーストして手作業で段差(インデントと言います)をつけたものが下記になります。

select 伝票データ.相手先コード,伝票データ.相手先名,担当コースマスタ.担当者
from (
      select *
      from 伝票データ
      left join (select 担当者,コード
                 from 担当コースデータ
                 where コード in (select コード
                                  from 担当コースデータ
                                  where 削除=No and メイン=Yes
                                  group by コード
                                  having count(*)=1
                                 ) as 担当コースデータ
                ) on 伝票データ.相手先コード=担当コースデータ.コード
    ) as 伝票データ

動作環境も、どのようなエラーが出ているのかもわかりませんので、とりあえず気になった点だけに修正してみました。

(SQL予約語は慣例的に大文字なので変えてあります)

SELECT 伝票データ.相手先コード,伝票データ.相手先名,伝票データ.担当者
FROM (
      SELECT 伝票データ.*,担当コースデータ.担当者
      FROM 伝票データ
      LEFT JOIN (SELECT 担当者,コード
                 FROM 担当コースデータ
                 WHERE コード IN (SELECT コード
                                  FROM 担当コースデータ
                                  WHERE 削除='No' AND メイン='Yes'
                                  GROUP BY コード
                                  HAVING count(*) = 1
                                 )
                ) ON 担当コースデータ.コード = 伝票データ.相手先コード
    ) AS 伝票データ

最後になりましたが、ご質問の際には使っているプログラム言語は書いておきましょう。

文章から推測することはある程度可能ですが、

同じプログラム言語であったとしてもバージョンが違えば違う事もありますので、お互いに2度手間3度手間になります。

id:uuuu_mmmm0120

そうですね。言語とそのバージョンとエラーメッセージは残すべきでしたね。実は最初はそれらを記してたんですが500字以内に質問を抑えないとアップされないのでそれらの情報を省いてしまったんですよ。今思えばsql = sql & みたいな書き方を改めるべきでしたね。今回のsql文の件については解決しました。ホントにありがとうございます。

2008/08/26 09:54:00
  • id:kn1967
    文字数制限にかかった場合は質問本文を投稿した後に
    コメント欄にコードを書くという手が使えます。

    問題解決されたようですが
    今後でてくるであろう部分も含めて回答してありますので
    いまいちど私の回答内で変更してある箇所を紐解いてみてください。
    それとデバッグの方法として
    Debug.Printを使ったSQLの内容確認方法も合わせてどうぞ。

    直球勝負のほうがポイントもらえるなら
    今後はもっと手抜きしようかなw
  • id:uuuu_mmmm0120
    僕がやり方が間違ってるのかも知れないんですけどコメント欄に補足事項を書くというやり方は誰かが投稿してくれないと書けないようになってるっぽいんですよ。直球勝負のほうがポイントもらえるとかそんなルール作ってないっす(笑)お客さんが来たんであわてて決済ボタンを押しちゃっただけです。僕、実はプログラマーじゃないんで。みんな欲しいのかなポイント。kn1967さんね。覚えておきますよ。後で違うの答えてくれたらトスします。ちなみに
    select 伝票データ.相手先コード,伝票データ.相手先名,SUB伝票データ.メーカーコード,SUB伝票データ.商品コード,SUB伝票データ.商品名,SUB伝票データ.売価,SUB伝票データ.金額,SUB伝票データ.単位,SUB伝票データ.単価,SUM(SUB伝票データ.数量) as 数量,SUM(SUB伝票データ.数量 * SUB伝票データ.単価) as 納価合計,伝票データ.担当者 from (select * from 伝票データ left join (select 担当者,コード from 担当コースデータ where コード in (select コード from 担当コースデータ where 削除=No and メイン=Yes group by コード having count(*)=1) group by コード,担当者) as 担当コースデータ on 伝票データ.相手先コード=担当コースデータ.コード) as 伝票データ right join SUB伝票データ on 伝票データ.伝票番号=SUB伝票データ.伝票番号 where year(伝票データ.発行日)=2008 and month(伝票データ.発行日)=07 and 伝票データ.担当者='井上 ' group by 伝票データ.相手先コード,伝票データ.相手先名,伝票データ.担当者,SUB伝票データ.商品コード,SUB伝票データ.商品名,SUB伝票データ.メーカーコード,SUB伝票データ.売価,SUB伝票データ.金額,SUB伝票データ.単位,SUB伝票データ.単価 order by 伝
    票データ.相手先コード,SUB伝票データ.メーカーコード,SUB伝票データ.商品コード
    で通りました。皆さんthanksです。
  • id:kn1967
    ポイントの件は冗談ですよ。最後に w つけてあるでしょ?
    ポイントだけなら楽して集める方法はいろいろ考えられますけど
    欲しいのは「xxの方法で出来ました」とか
    「xxの部分が役にたちました」といったような
    具体的な結果を含んだ返事だったりします。
    質問した人、応答した私、後から見に来た人、それぞれが
    「やったね!!ばんざい!!」出来るようになればと願って回答してます。
    (そのため、時には辛らつなコメントを入れるときもあったりします)

    話を戻して、コメント欄についてはデフォルトがクローズになっているのですが
    質問者にはコメント欄をいつでも開け閉め出来る権限があり、説明は下記にあります。
    質問時に開けておくと回答前に回答者側からの追加質問などが受けられるので通常は便利です。
    (質問内容によっては、変な回答者を呼び寄せてしまう事もありますが・・・)
    http://hatenaquestion.g.hatena.ne.jp/keyword/%e8%b3%aa%e5%95%8f%e3%81%99%e3%82%8b#question
    # はてな の ヘルプ系は何かと使いづらい。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません