第一篇文章;对我很轻松。
相对较新的SQL(真正超出简单查询的任何东西),但试图学习更复杂的功能以利用优质的服务器资源。我的问题:
我想使用SUM函数来汇总各种来源的现金流量。我希望看到这些现金流量按月计算。因为现金流量是在不同的时间开始的,所以我想对它们进行调整以使它们全部对齐。我目前的代码:
select
months_between(A.reporting_date, B.start_date) as season,
sum(case when A.current_balance is null then B.original_balance
else A.current_balance end) as cashflow
from dataset1 A, dataset2 B
group by season
order by season
现在,执行这样的代码会生成一条错误消息,指出A.reporting_date和B.start_date必须是GROUPED或AGGREGATE函数的一部分。
问题是,如果我将它们添加到GROUP BY语句中,当它生成没有错误的输出时,我得到的现金流量总和基本上是与所有分组变量的笛卡尔交叉。
这么长的故事简短,我有什么方法可以获得仅按季节分组的现金流量总和?如果是这样,任何想法怎么做?
谢谢。
答案 0 :(得分:2)
大多数数据库都不允许使用先前在where
,group by
和order by
子句中定义的列别名。
对于您的查询,您应使用months_between(A.reporting_date, B.start_date)
代替season
和group by
中的别名order by
。
此外,您的查询将返回cross product
,因为未指定join
条件。
select
months_between(A.reporting_date, B.start_date) as season,
sum(case when A.current_balance is null then B.original_balance
else A.current_balance end) as cashflow
from dataset1 A
JOIN dataset2 B ON --add a join condition
group by months_between(A.reporting_date, B.start_date)
order by months_between(A.reporting_date, B.start_date)