【发布时间】:2016-08-16 17:57:24
【问题描述】:
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
这可能与我想要实现的目标相去甚远,但我正在努力解决它。
提前非常感谢!!
【问题讨论】:
-
艾伦欢迎来到stackoverflow!您的问题有一个良好的开端,但还应根据您的示例数据包括您想要的结果,并向我们展示您尝试过的东西。如果它偏离或不起作用,请不要担心它只是帮助我们知道我们正在帮助您而不是为您做这件事,并且可以对您所需的逻辑产生一些额外的见解。
-
感谢马特。我编辑了我的帖子。
-
您可以使用条件聚合来创建这样的数据透视表。但是根据哪个数据库/rdbms(sql-server、oracle、mysql),您使用的系统可能还有其他一些可用的选项?也可以在您希望查询显示的内容中放置一行 daa,以帮助人们更好地可视化
-
我已按您的要求输入了示例行。使用 mysql。谢谢。
标签: sql