如何使用多个参数获取计数和总和以防万一

Posted

技术标签:

【中文标题】如何使用多个参数获取计数和总和以防万一【英文标题】:How to get count and sum with multiple parameter in case when 【发布时间】:2021-11-23 15:29:47 【问题描述】:

我在 mysql 中有下表(版本 - 5.7.18-log)。

ID      Old_Date       Curr_Date             Status       Price       items
ID-1    2021-07-14     2021-09-30 13:15:15   Done         1500        3
ID-1    2021-06-26     2021-09-30 13:15:15   Hold         3500        6
ID-1    2021-05-26     2021-09-30 13:15:15   In Progress  4500        1
ID-1    2021-03-04     2021-09-30 13:15:15   Done         5000        3
ID-1    2021-01-11     2021-09-30 13:15:15   Done         2800        2

从上表中,我需要获取最近 1、6 和 9 个月间隔内状态为 DoneHold 的实例的计数和总和。

需要计算Old_DateCurr_Date之间的间隔。

需要的输出-

ID     1_Month_Count  6_Month_Count  9_Month_Count   1_Month_Sum  6_Month_Sum  9_Month_Sum
ID-1   0              2              4               0            5000         12800         

我尝试了以下查询,但它不起作用。

SELECT ID,
SUM(CASE WHEN TIMESTAMPDIFF(month, Old_Date, Curr_Date) <= 12  
WHEN (Status IN ('Done', 'Hold') THEN SUM(ID) ELSE 0 END) AS 12_Month_Done`,
FROM Table
Group BY ID;

【问题讨论】:

你的月份计算逻辑是什么。示例 1(“2021-01-01”和“2021-06-28”)示例 2(“2021-01-17”和“2021-07-05”)。请检查两个示例 @RahulBiswas - 它基于Curr_Date 减去Old_Date 以及给定条件。 【参考方案1】:

如果您只希望结果中出现与您的条件匹配的IDs,则在过滤表后使用条件聚合:

SELECT ID,
       COUNT(CASE WHEN Old_Date >= Curr_Date - INTERVAL 1 month THEN 1 END) AS `1_Month_Count`,
       COUNT(CASE WHEN Old_Date >= Curr_Date - INTERVAL 6 month THEN 1 END) AS `6_Month_Count`,
       COUNT(*) AS `9_Month_Count`, 
       SUM(CASE WHEN Old_Date >= Curr_Date - INTERVAL 1 month THEN Price ELSE 0 END) AS `1_Month_Sum`,
       SUM(CASE WHEN Old_Date >= Curr_Date - INTERVAL 6 month THEN Price ELSE 0 END) AS `6_Month_Sum`,
       SUM(Price) AS `9_Month_Sum`            
FROM tablename
WHERE Status IN ('Done', 'Hold') AND Old_Date >= Curr_Date - INTERVAL 9 month
GROUP BY ID;

如果你想要所有的IDs,即使它们不符合条件:

SELECT ID,
       COUNT(CASE WHEN Old_Date >= Curr_Date - INTERVAL 1 month 
            AND Status IN ('Done', 'Hold') THEN 1 END) AS `1_Month_Count`,
       COUNT(CASE WHEN Old_Date >= Curr_Date - INTERVAL 6 month 
            AND Status IN ('Done', 'Hold') THEN 1 END) AS `6_Month_Count`,
       COUNT(CASE WHEN Old_Date >= Curr_Date - INTERVAL 9 month 
            AND Status IN ('Done', 'Hold') THEN 1 END) AS `9_Month_Count`, 
       SUM(CASE WHEN Old_Date >= Curr_Date - INTERVAL 1 month 
            AND Status IN ('Done', 'Hold') THEN Price ELSE 0 END) AS `1_Month_Sum`,
       SUM(CASE WHEN Old_Date >= Curr_Date - INTERVAL 6 month 
            AND Status IN ('Done', 'Hold') THEN Price ELSE 0 END) AS `6_Month_Sum`,
       SUM(CASE WHEN Old_Date >= Curr_Date - INTERVAL 9 month 
            AND Status IN ('Done', 'Hold') THEN Price ELSE 0 END) AS `9_Month_Sum`            
FROM tablename
GROUP BY ID;

请参阅demo。

【讨论】:

【参考方案2】:

我认为存储过程将是实现这一目标的一种方式。 在此过程中,您必须在 1、6 和 9 个月内执行 3 次查询。 喜欢

SELECT COUNT(ID) as cnt_id, SUM(price) as sum_price INTO 1_month_count, 1_month_sum WHERE status = 'Hold' OR status = 'Done' AND TIMESTAMPDIFF(MONTH, old_date, curr_date) >= 1 AND  TIMESTAMPDIFF(MONTH, old_date, curr_date) < 6;

然后您通过

返回变量 1_month_count 等
SELECT @1_month_count, @1_month_sum; /*and all others*/

更多关于带有 OUT 参数的存储过程的信息可以在这里找到: https://dev.mysql.com/doc/refman/8.0/en/create-procedure.html

【讨论】:

以上是关于如何使用多个参数获取计数和总和以防万一的主要内容,如果未能解决你的问题,请参考以下文章

如何使用mysql从图像表中获取总数?

如何编写从多个表中获取多行数量总和的查询?

Oracle表中多个组的列的总和值

如何使用 where 和 Group by 返回多个总和结果

如何使用 PHP 获取多个文件计数

结合两个查询并获得计数的总和