• 締切済み

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.区分 = 月末 以上

みんなの回答

  • nfushi
  • ベストアンサー率31% (39/122)
回答No.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

  • nfushi
  • ベストアンサー率31% (39/122)
回答No.2

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

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

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

関連するQ&A