- 締切済み
sqlserver2005 JOINしてUNION
現在下記のSQL文で会社単位で訪問回数と請負費を出していますが。 JOINしているテーブルをUNION(複数テーブルの合計)するにはどうしたらいいですか? (テーブルは社員単位で作成しています) SELECT TEST11.会社名, SUM(TEST2.訪問回数) AS 訪問回数, SUM(TEST2.訪問回数 * TEST2.単価) AS 請負費 FROM TEST11 RIGHT OUTER JOIN TEST2 ON TEST11.訪問日 = TEST2.訪問日 AND TEST11.区分コード = TEST2.管理番号 GROUP BY TEST11.会社名 ORDER BY TEST11.会社名 結果は下記になってます |会社名|訪問回数|請負費| 分る方ご教授頂けると幸いです
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- NoMusicNoLife49
- ベストアンサー率63% (14/22)
社員テーブル1~3があると仮定した場合、以下のSQLで実現可能です。 SELECT NES.会社名 ,SUM(NES.訪問回数) AS 訪問回数合計 ,SUM(NES.単価) AS 請負費合計 FROM( --社員テーブルその1 SELECT TEST11.会社名, SUM(TEST2.訪問回数) AS 訪問回数, SUM(TEST2.訪問回数 * TEST2.単価) AS 請負費 FROM TEST11 RIGHT OUTER JOIN TEST2 ON TEST11.訪問日 = TEST2.訪問日 AND TEST11.区分コード = TEST2.管理番号 GROUP BY TEST11.会社名 UNION ALL --社員テーブルその2 SELECT TEST11.会社名, SUM(TEST2.訪問回数) AS 訪問回数, SUM(TEST2.訪問回数 * TEST2.単価) AS 請負費 FROM TEST11 RIGHT OUTER JOIN TEST2 ON TEST11.訪問日 = TEST2.訪問日 AND TEST11.区分コード = TEST2.管理番号 GROUP BY TEST11.会社名 UNION ALL --社員テーブルその3 SELECT TEST11.会社名, SUM(TEST2.訪問回数) AS 訪問回数, SUM(TEST2.訪問回数 * TEST2.単価) AS 請負費 FROM TEST11 RIGHT OUTER JOIN TEST2 ON TEST11.訪問日 = TEST2.訪問日 AND TEST11.区分コード = TEST2.管理番号 GROUP BY TEST11.会社名 ) AS NES GROUP BY NES.会社名 ORDER BY NES.会社名
- Siegrune
- ベストアンサー率35% (316/895)
select x.会社名,SUM(x.訪問回数) AS 訪問回数, SUM(x.請負費) AS 請負費 from ( SELECT TEST11.会社名,TEST2.訪問回数,TEST2.訪問回数 * TEST2.単価 AS 請負費 FROM TEST11 RIGHT OUTER JOIN TEST2 ON TEST11.訪問日 = TEST2.訪問日 AND TEST11.区分コード = TEST2.管理番号 union SELECT TEST21.会社名,TEST22.訪問回数,TEST22.訪問回数 * TEST22.単価 AS 請負費 FROM TEST21 RIGHT OUTER JOIN TEST22 ON TEST21.訪問日 = TEST22.訪問日 AND TEST21.区分コード = TEST22.管理番号 union SELECT TEST31.会社名,TEST32.訪問回数,TEST32.訪問回数 * TEST32.単価 AS 請負費 FROM TEST31 RIGHT OUTER JOIN TEST32 ON TEST31.訪問日 = TEST32.訪問日 AND TEST31.区分コード = TEST32.管理番号 union ・・・ ) x GROUP BY x.会社名 ORDER BY x.会社名 とすればいいだけだろうけど、 遅そうなので、 SELECT TEST11.会社名,TEST2.訪問回数,TEST2.訪問回数 * TEST2.単価 AS 請負費 FROM TEST11 RIGHT OUTER JOIN TEST2 ON TEST11.訪問日 = TEST2.訪問日 AND TEST11.区分コード = TEST2.管理番号 をそれぞれ、元のように、 SELECT TEST11.会社名,sum(TEST2.訪問回数),sun(TEST2.訪問回数 * TEST2.単価) AS 請負費 FROM TEST11 RIGHT OUTER JOIN TEST2 ON TEST11.訪問日 = TEST2.訪問日 AND TEST11.区分コード = TEST2.管理番号 GROUP BY TEST11.会社名 としたほうがいいかも。(どっちが早いかは一概に言えません。) 後者は元のSQLから order byを除去して、unionを追加して全部まとめて、 select x.会社名,SUM(x.訪問回数) AS 訪問回数, SUM(x.請負費) AS 請負費 from ( を前に、 ) x GROUP BY x.会社名 ORDER BY x.会社名 を後につけるだけ。 (未検証ですが)
- cma3atgoo
- ベストアンサー率35% (32/90)
うまく読み取れてなかったらごめんなさい。 >テーブルは社員単位で作成しています 社員ごとに別テーブルになっている? TEST11 は取引先会社のテーブル? TEST2 は社員ごとのテーブル? 現在は社員一人につき取引先会社ごとの請負費を集計している? これを社員全体について取引先会社ごとの請負費を集計したい? こんなふうにしたらどうですか? SELECT TEST11.会社名, SUM(A.訪問回数) AS 訪問回数, SUM(A.訪問回数 * A.単価) AS 請負費 FROM TEST11 RIGHT OUTER JOIN (SELECT 訪問日, 管理番号, 訪問回数, 単価 FROM TEST2 UNION SELECT 訪問日, 管理番号, 訪問回数, 単価 FROM TEST? UNION SELECT 訪問日, 管理番号, 訪問回数, 単価 FROM TEST? : 社員分繰り返し : ) A ON TEST11.訪問日 = A.訪問日 AND TEST11.区分コード = A.管理番号 GROUP BY TEST11.会社名 ORDER BY TEST11.会社名
お礼
早期回答有難う御座います >>テーブルは社員単位で作成しています >社員ごとに別テーブルになっている? はいそうです >TEST11 は取引先会社のテーブル? はいそうです >TEST2 は社員ごとのテーブル? はいそうです >現在は社員一人につき取引先会社ごとの請負費を集計している? >これを社員全体について取引先会社ごとの請負費を集計したい? はいそうです >こんなふうにしたらどうですか? まだ試していませんが 下記のSQL文を見ると TEST11の中に会社名がいないと、 訪問回数と請負費がヒモずかない状況かと思います 会社名が TEST11に無くて TEST12に有る場合が発生しています TEST2(社員名)が訪問したTEST2(取引会社)です TEST3(社員名)が訪問したTEST12(取引会社)です ・ ・ 社員分繰り返し テーブルはこのようになっています TEST11-TEST2 TEST12-TEST3 TEST13-TEST4 TEST14-TEST5 TEST15-TEST6 SELECT TEST11.会社名, SUM(A.訪問回数) AS 訪問回数, SUM(A.訪問回数 * A.単価) AS 請負費 FROM TEST11 RIGHT OUTER JOIN (SELECT 訪問日, 管理番号, 訪問回数, 単価 FROM TEST2 UNION SELECT 訪問日, 管理番号, 訪問回数, 単価 FROM TEST? UNION SELECT 訪問日, 管理番号, 訪問回数, 単価 FROM TEST? : 社員分繰り返し : ) A ON TEST11.訪問日 = A.訪問日 AND TEST11.区分コード = A.管理番号 GROUP BY TEST11.会社名 ORDER BY TEST11.会社名 もう少しのご教授頂ければ幸いです
お礼
お返事有難う御座います。 前者確認出来ましたが、そもそも計算方法が間違ってました・・・汗 Accessでは一旦クエリで会社名をGROUP BYさせ 訪問回数と単価テーブルをクエリで作成し 集計クエリで計算させてます (二重クエリみたいな・・) SqlServerでは二重クエリが不可の為 一つのSQL文の中に すべての会社名をGROUP BYさせて 集計させたいのですが可能ですか?