我很难达到sql的目标。花了几个小时在这里和其他地方阅读类似的问题,但我的问题似乎是独一无二的。
我的数据库有几列:
客户名称| |项目| |类型| |日期| |成本| |更正
客户1 项目1 电视 2018-1 100 不
客户1 项目1 电视 2018-1 -50 对
所以这张表需要一些解释(它的每一行都有一个auto_inc id。)correction=no表示这是一个原始值,在预测财务时创建“是”意味着这是价格的后期调整。
我的目标是把预测和实际并排看。所以每个月,它都应该加上correction=no值(这对于
SELECT date, SUM(cost) FROM table WHERE correction='no' GROUP BY date)
然后列出所有实际值(不带where子句的sum)。
行需要根据客户机、项目、类型和日期进行匹配。这看起来很简单,但我已经得到单行错误,自然。从逻辑上讲,我找不到一个解决方案来解决这个问题,而且我更像是一个初学者。
所以我想:
包含月份的列,
包含sum(cost)的列,其中correction='no',
还有一个列,列出了所有成本的总和,当然这些成本都是按月份划分的。
我希望你能提供一些意见。
2条答案
按热度按时间nvbavucw1#
使用条件聚合。
聚合函数对一组值执行计算并返回单个值。
条件聚合是对条件表达式的聚合,例如
correction = 'no'
. 这是通过一个CASE
在聚合函数中构造(SUM
此处):klsxnrf12#
在这种情况下,我喜欢使用公共表表达式(cte)来分解它。这允许我计算每个客户/项目/月的预计成本,并将其放在一个cte中,然后分别计算另一个cte中的实际成本,然后从每个结果中查询。
注意:我使用以下方法构建测试表和值:
我的结果是: