累積値を追加させたい
SQLで課金発生数の月ごとの当月累積値と前月累積値の列を追加させたいのですが検索しても思うようにいかず悩んでおります。
ご教示頂きたくお願いします。
当月累積値 = 前月累積値 + 課金発生数
前月累積値 = 当月累積値 - (当月課金発生数 - 当月解約数)
該当のソースコード
SQL
1SELECT DATE_FORMAT(client_use_services.created_at, '%Y年%m月') AS '年月', 2 IFNULL(tbl1.cnt, 0) AS '課金', 3 IFNULL(tbl2.cnt, 0) AS '解約' 4 5FROM client_use_services 6 7 LEFT JOIN 8 ( 9 SELECT count(*) as cnt, DATE_FORMAT(billing_start_date, '%Y%m') as date 10 FROM client_use_services 11 LEFT JOIN clients ON clients.id = client_use_services.client_id 12 WHERE clients.client_type = 1 13 GROUP BY DATE_FORMAT(billing_start_date, '%Y%m') 14 ) as tbl1 15 ON 16 tbl1.date = DATE_FORMAT(client_use_services.created_at, '%Y%m') 17 18 LEFT JOIN 19 ( 20 SELECT count(*) as cnt, DATE_FORMAT(billing_end_date, '%Y%m') as date 21 FROM client_use_services 22 LEFT JOIN clients ON clients.id = client_use_services.client_id 23 WHERE clients.client_type = 1 24 AND billing_start_date IS NOT NULL 25 AND billing_end_date IS NOT NULL 26 GROUP BY DATE_FORMAT(billing_end_date, '%Y%m') 27 ) as tbl2 28 ON 29 tbl2.date = DATE_FORMAT(client_use_services.created_at, '%Y%m') 30 31GROUP BY DATE_FORMAT(client_use_services.created_at, '%Y年%m月'), 32 tbl1.cnt, 33 tbl2.cnt;
現在のテーブル
当月累積値 = 前月累積値 + 課金発生数
前月累積値 = 当月累積値 - (当月課金発生数 - 当月解約数)
上記の式だと当月累積値と前月累積値で循環していますけど?
ご指摘ありがとうございます。そうですよね。ほかに算出方法が浮かばず悩んでおります。
累積の範囲は無く、当該月までの累計ですか?
はい。その月の値+前月までの累計値を表示させたいと考えております。
SQLの前に課金、解約、累積値とはそれぞれ何なのかを、他の人に文書で正確に伝えられる状態にまで整理してみてください。
その過程で自己解決するかもしれないし、解決しなければ質問に追記してください。
承知しました。整理いたします。
billing_start_dateなど、どのテーブルの項目なのかSQLだけでは判断できないものがありますので、テーブルの定義も明確にして下さい。
DATE_FORMAT, IFNULL って Oracle Database にはない関数ですが、タグはあっていますか?
回答1件
あなたの回答
tips
プレビュー