SQLが得意な方ご教授願います 自己結合でのSELECTについて

締切り済みの質問

SQLが得意な方ご教授願います 自己結合でのSELECTについて

あるテーブルを自己結合して目的の表を作成したいのですが、
目標の表が作成出来ません。下記に作成したSQLを記載しました。
どこが悪いのかご教授願います。

下記「あ」のようなテーブルがあるとします。

「あ」
県    日別      種類  区分   事故数
東京   2008/3/1   バイク 日    50
東京   2008/3/31   バイク 月末   20
東京   2008/3/31   車   月末   30
東京   2008/4/30   バイク 月末   40
埼玉   2008/5/31   車   月末   10

このテーブルから区分が"日"の"事故数"を"月末"に加算した結果を抽出したいとおもいます。
抽出の最終目標は「い」の内容です。

「い」
県    日別     種類  区分  事故数  総数
東京   2008/3/31 バイク  月末  20   70
東京   2008/3/31 車    月末  30   30
東京   2008/4/30 バイク  月末  40   90

しかし私が作成したSQLですと「う」の形となってしまいます。

「う」
県     日別    種類   区分   事故数  総数
東京    2008/3/31  バイク  月末   20    70
東京    2008/3/31  車    月末   30    (空白)
東京    2008/4/30  バイク  月末   40    90

使用SQL
select
A.県,
A.日別,
A.種類,
A.区分,
A.事故数,
A.事故数 + (
select B.事故数 from 事故TBL B
where A.県 = B.県 and
A.種類 = B.種類 and
A.区分 = 日
) as 総数
from 事故TBL A
where
A.県 = 東京
and A.区分 = 月末

以上

投稿日時 - 2008-06-01 15:51:58

連想キーワード:

QNo.4067153

すぐに回答ほしいです

0人が「このQ&Aが役に立った」と投票しています

[  前へ  |  次へ ]

回答(3件中 1~3件目)

ANo.3

SQLServerで正解に近いと思われるSQLを書いてみました。
日別の取り扱いが面倒だったので切り分けています。
もしテーブルの構造を変えられるなら変えたほうがいいと思います。

SELECT
 A.県,
 A.種類,
 A.区分,
 A.TSUKI AS 月,
 A.NEN AS 年,
 ISNULL(B.JIKOSU,A.JIKOSU) AS 事故数,
 A.JIKOSU AS 総数
FROM
(
SELECT
 T.県,
 T.種類,
 'MON' AS 区分,
 YEAR(T.日別) AS NEN,
 MONTH(T.日別) AS TSUKI,
 SUM(T.事故数) AS JIKOSU
FROM
TABLE T
GROUP BY
 T.県,
 T.種類,
 YEAR(T.日別),
 MONTH(T.日別)
 )A LEFT JOIN
 (
SELECT
 T.県,
 T.種類,
 T.区分,
 YEAR(T.日別) AS NEN,
 MONTH(T.日別) AS TSUKI,
 SUM(T.事故数) AS JIKOSU
FROM
TABLE T
WHERE T.区分 = '日'
GROUP BY
 T.県,
 T.種類,
 T.区分,
 YEAR(T.日別),
 MONTH(T.日別)
 )B ON A.県 = B.県
  AND A.種類 = B.種類
  AND A.TSUKI = B.TSUKI 
  AND A.NEN = B.NEN
  ORDER BY
  A.県 DESC,
  A.TSUKI,
  A.NEN

投稿日時 - 2008-06-01 20:19:14

ANo.2

正解は
県    日別     種類  区分  事故数  総数
東京   2008/3/31   バイク 月末  20    70
東京   2008/3/31   車   月末  30    30
東京   2008/4/30   バイク 月末  40    40
埼玉   2008/5/31   車   月末  10    10
ではないでしょうか?
4月の日区分ってないですよね?

投稿日時 - 2008-06-01 19:39:08

ANo.1

区分=日のデータがないと、()内のサブクエリがNULLになります。
NULLを含む演算結果はNULLなので、総数が空欄になると考えられます。
次にグループ化の対象が、「県、年、月、種類」と思います。
先ず、NULLを0にするにはNVL(Oracle)やISNULL(SQLServer)といった
関数がありますが、DBシステム固有のものなので、データベースが何かが
分からないと、答えられません。また、サブクエリも区分=日だけでは
該当する年月以外のものを集計してしまいます。

投稿日時 - 2008-06-01 16:51:00

あわせてチェックしたい
  • SELECT * FROM tbl WHERE a = ?; ...
  • 外部結合での"OR"文 ...
  • Accessの表結合SQL ...
PR
記憶にのこっている野球選手は誰ですか?[ 詳細 ]

OKWaveのオススメ

教えて弁護士さん!

お金の悩みQ&A特集はこちら