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
这可能与我试图实现的目标有所不同,但我正在努力解决这个问题。
提前多多感谢!!
答案 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天,但我很确定我明白您的需要。
希望有所帮助。