【问题标题】:Sum of different sums不同和的总和
【发布时间】:2020-08-28 12:26:11
【问题描述】:

大家好,

我在组合 3 个不同求和查询的值时遇到问题。 我们有一个包含几列的表,例如:customer_id, amount_hours, start_date, end_date, one_time。

有 3 种不同的类别/条件可以总结出来。

  1. one_time 为真

  2. end_date 为 NULL,one_time 为 false

  3. end_date 不为 NULL 且 one_time 为 false

我完成了这 3 个查询。他们完美地工作。现在我当然想将结果添加到 customer_id 旁边的单个列中。该表代表的是“空闲时间”的数量(对不起,英语不是我的母语,我想不出更好的表达方式)。客户要么购买了一定数量的一次性付款,要么签订了一份每月增加 X 小时的合同。

假设客户 random-store 购买了 20 小时作为一次性付款,去年全年支付了每月 5 小时的费用,而今年已将其更改为每月 8 小时。那么它需要总和 20 + (12months * 5 hours = 60) + (8months {现在是八月} * 8 hours = 64) = 144。

到目前为止,我得到了 3 个查询来获得 20、60 和 64。但是如果我尝试像 select sum ((select sum(....)+select sum(....)+select sum(....)) 这样的东西,那么它就不起作用了。我得到了语法错误,我感觉我正在尝试一些不正确的语法结构应该是什么样子的东西,添加了三个不同的求和查询。尝试谷歌搜索它,没有运气。有人可以帮忙吗?

第一个总和:

select sum (amount_hours) from [myTable] where customer_id=100112 AND one_time= 'True'

第二次总和:

select sum ((datediff(month, Start_Date, End_Date)+1)* amount_hours) from [myTable] where customer_id = 100112 AND one_time = 'False' and end_date is not NULL

第三次总和:

select sum ((datediff(month, Start_Date, Getdate())+1) * amount_hours) from [myTable] where customer_id = 100112 AND one_time = 'False' and end_date is NULL

我的样本故意包含一个 customer_id。以后不用他们和一个小组就可以了。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    1.one_time 为真

    2.end_date 为 NULL,one_time 为 false

    3.end_date 不为 NULL 且 one_time 为假

    没问题。

    SELECT customer_id, 
           SUM(CASE WHEN one_time = 'True'
                    THEN amount_hours 
                    END) sum1,
           SUM(CASE WHEN end_date IS NULL and one_time = 'False'
                    THEN (DATEDIFF(MONTH, Start_Date, End_Date) + 1) * amount_hours 
                    END) sum2,
           SUM(CASE WHEN end_date IS NOT NULL and one_time = 'False'
                    THEN (DATEDIFF(MONTH, Start_Date, Getdate()) + 1) * amount_hours
                    END) sum3
    FROM myTable
    GROUP BY customer_id
    

    如果需要,您可以将ELSE 0 添加到 CASE。

    【讨论】:

    • 对不起,好像我解释得不够清楚。当我把它放进去时,我得到 customer_id 然后 sum1, sum2, sum3 作为列。但只需要 customer_id 和其他 3 列的总和。所以总共只有 2 列,其中之一是 customer_id。
    • 您只需将“sum1”、“sum2”替换为“+”即可,得到customer_id, SUM(...) + SUM(...) + SUM(...)
    • 谢谢@Pepper 同时我已经通过使用一个总和解决了它(当 {condition1} THEN WHEN {condition2} THEN WHEN {condition3} THEN 的情况也是这样的。Akina 混合了逻辑最多,因为如果 end_date 为 NULL(而不是当它不是 NULL 时)应该使用 GetDate()。所以我的预期结果不匹配,我很困惑。无论如何,你的两个答案都帮助我做对了。谢谢!!!
    猜你喜欢
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多