我编写了一个 SQL 查询,用于输出客户信用数据(合同、欠款金额等)。现在我希望此查询输出 30,60 和 90 天逾期金额的份额。但现在我只能写出所有客户价值的一小部分。
表架构
CREATE TABLE mysql_test_a (
id_contract INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
id_client int4 NOT NULL,
dt_start_ep date NOT NULL,
dt_end_ep date NOT NULL,
amt_overdue int(4)
);
查询
SELECT id_client, count(id_contract) numb_cont,
count( CASE WHEN dt_end_ep >= date_add(dt_start_ep,INTERVAL 30 DAY) then 1 end) as 30_days,
count( CASE WHEN dt_end_ep >= date_add(dt_start_ep,INTERVAL 60 DAY) then 1 end) as 60_days,
count( CASE WHEN dt_end_ep >= date_add(dt_start_ep,INTERVAL 90 DAY) then 1 end) as 90_days,
sum(amt_overdue) as amt_sum,
sum(CASE WHEN dt_end_ep >= date_add(dt_start_ep,INTERVAL 30 DAY)
THEN amt_overdue
ELSE 0
END) AS 30_day_amt,
sum(CASE WHEN dt_end_ep >= date_add(dt_start_ep,INTERVAL 60 DAY)
THEN amt_overdue
ELSE 0
END) AS 60_day_amt,
sum(CASE WHEN dt_end_ep >= date_add(dt_start_ep,INTERVAL 90 DAY)
THEN amt_overdue
ELSE 0
END) AS 90_day_amt,
**SUM(amt_overdue) OVER() / SUM(SUM(amt_overdue)) OVER(PARTITION BY id_client ORDER BY id_client ASC) AS percentage**
from mysql_test_a
group by id_client,amt_overdue
SUM(CASE WHEN dt_end_ep >= DATE_ADD(dt_start_ep, INTERVAL 30 DAY) THEN amt_overdue ELSE 0 END) / sum(amt_overdue) AS share_30_days,
SUM(CASE WHEN dt_end_ep >= DATE_ADD(dt_start_ep, INTERVAL 60 DAY) THEN amt_overdue ELSE 0 END) / sum(amt_overdue) AS share_60_days,
SUM(CASE WHEN dt_end_ep >= DATE_ADD(dt_start_ep, INTERVAL 90 DAY) THEN amt_overdue ELSE 0 END) / sum(amt_overdue) AS share_90_days