- 締切済み
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.区分 = 月末 以上
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- nfushi
- ベストアンサー率31% (39/122)
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)
正解は 県 日別 種類 区分 事故数 総数 東京 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)
区分=日のデータがないと、()内のサブクエリがNULLになります。 NULLを含む演算結果はNULLなので、総数が空欄になると考えられます。 次にグループ化の対象が、「県、年、月、種類」と思います。 先ず、NULLを0にするにはNVL(Oracle)やISNULL(SQLServer)といった 関数がありますが、DBシステム固有のものなので、データベースが何かが 分からないと、答えられません。また、サブクエリも区分=日だけでは 該当する年月以外のものを集計してしまいます。