SQL,发票声明,当前和过去的会费

时间:2016-08-16 17:57:25

标签: sql

SQL新手,了解基本查询,尝试编写比我的知识更先进的东西,如果有人能提供它,需要一些帮助。我已经尝试过模板代码并根据自己的需求进行调整,但没有成功。

我正在使用1个表,并尝试让查询显示客户当前余额0-30天,以及过期截止日期介于30-60,60-90,90-120,120 +之间天。

table: c_inv_h
columns: comp_code, cust_code, inv_num, inv_date, inv_tp, inv_amt, inv_tax1, inv_tax2

示例数据

comp_code, cust_code, inv_num, inv_date, inv_tp, inv_amt, inv_tax1, inv_tax2
M1, 100068, 1, 2016-08-11, RCPT, 103.48, 4.5, 8.98
M1, 100068, 2, 2016-07-11, RCPT, 103.48, 4.5, 8.98
M1, 100068, 3, 2016-06-11, RCPT, 103.48, 4.5, 8.98
M1, 200027, 4, 2016-05-11, RCPT, 103.48, 4.5, 8.98
M1, 200027, 5, 2016-04-11, RCPT, 103.48, 4.5, 8.98

我想要查询显示的内容:

comp_code, cust_code, CurrentBalance, 30-60, 60-90, 90-120, 120+
M1, 100068, 116.96, 233.92, 0, 0, 0
M1, 200027, 0, 233.92, 0, 0, 0
M1, 200027, 0, 0, 0, 0, 233.92

到目前为止我尝试了什么

SELECT comp_code, cust_code, inv_num, inv_date, sum(inv_amt) + sum(inv_tax1)
+ sum(inv_tax2) as InvoiceTotal,
DATEDIFF(day, inv_date, sysdate as Numberofdays, 'CurrentBalance' = 
CASE WHEN DATEDIFF(day,inv_date, sysdate < 30 then InvoiceTotal END,
'30_days' = CASE WHEN DATEDIFF(day, inv_date, sysdate between 30 AND 60
Then InvoiceTotal WHEN DATEDIFF(day, inv_date, sysdate > 90 Then
InvoiceTotal END
FROM c_inv_h
WHERE comp_code='M1'
GROUP BY comp_code, cust_code

这可能与我试图实现的目标有所不同,但我正在努力解决这个问题。

提前多多感谢!!

1 个答案:

答案 0 :(得分:0)

您正在考虑条件聚合。您只需删除不参与聚合的列并清除语法错误。

SELECT
    comp_code
    ,cust_code
    ,SUM(CASE
          WHEN DATEDIFF(CURDATE(),inv_date) < 30
          THEN COALESCE(inv_amt,0.00) + COALESCE(inv_tax1,0.00) + COALESCE(inv_tax2,0.00)
          ELSE 0
        END
    ) AS CurrentBalance
    ,SUM(CASE
          WHEN DATEDIFF(CURDATE(),inv_date) >= 30 AND DATEDIFF(CURDATE(),inv_date) < 60
          THEN COALESCE(inv_amt,0.00) + COALESCE(inv_tax1,0.00) + COALESCE(inv_tax2,0.00)
          ELSE 0
        END
    ) AS "30-60"
    ,SUM(CASE
          WHEN DATEDIFF(CURDATE(),inv_date) >= 60 AND DATEDIFF(CURDATE(),inv_date) < 90
          THEN COALESCE(inv_amt,0.00) + COALESCE(inv_tax1,0.00) + COALESCE(inv_tax2,0.00)
          ELSE 0
        END
    ) AS "60-90"
    ,SUM(CASE
          WHEN DATEDIFF(CURDATE(),inv_date) >= 90 AND DATEDIFF(CURDATE(),inv_date) < 120
          THEN COALESCE(inv_amt,0.00) + COALESCE(inv_tax1,0.00) + COALESCE(inv_tax2,0.00)
          ELSE 0
        END
    ) AS "90-120"
    ,SUM(CASE
          WHEN DATEDIFF(CURDATE(),inv_date) >= 120
          THEN COALESCE(inv_amt,0.00) + COALESCE(inv_tax1,0.00) + COALESCE(inv_tax2,0.00)
          ELSE 0
        END
    ) AS "120+"
FROM
    c_inv_h
WHERE
    comp_code='M1'
GROUP BY
    comp_code, cust_code
;

我正在使用COALESCE来确保存在值,因为如果添加1 + NULL + 1,则添加列时结果将为NULL。使用聚合函数时,例如SUM()它将忽略NULL值。因为您根据数据集使用两者,所以您可能需要将0分配给COALESCE帮助的NULL。

接下来我没有使用BETWEEN,因为BETWEEN包含比较的两面,所以如果你说一列的30到60之间,另一列的60到90之间的金额是60天,那么它将是两列。

最后您的示例输出对于您提供的示例数据不正确,因为日期分别为5,36,66,97和127天,但我很确定我明白您的需要。

希望有所帮助。