如何编写一个 SQL 查询来输出 30,60 和 90 天的所有值总和的百分比。 MySQL

问题描述 投票:0回答:1

我编写了一个 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
mysql window-functions
1个回答
0
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.