【问题标题】:Looking For Rolling Total Aggregated By Month查找按月汇总的滚动总计
【发布时间】:2018-12-01 03:06:11
【问题描述】:

我查看并找到了运行总计,但没有按年份和月份将日期组合在一起。我从下面的查询中得到的结果显示了按日期计算的滚动余额,并结合了每天的交易数量。

select 
    acct,
    year(trans_date) 'Year',
    month(trans_date) 'Month',
    sum(dom_amount) over (partition by acct order by year(trans_date), month(trans_date)) as TotalBalance
from ledger_mst
where acct = 1100
group by 
    dom_amount, 
    acct,
    year(trans_date),
    month(trans_date),
    trans_date
order by trans_date

截至目前,我应该有 39 行(2015 年 9 月 - 2018 年 11 月),每个年和每个月以及月底的滚动余额。我的结果中目前有 16,477 行。看来我的 group by 已损坏,我不知道如何修复它。

我的 SQL 技能充其量只是平庸。对我放轻松。谢谢!

【问题讨论】:

    标签: sql sql-server ssms


    【解决方案1】:

    您应该在group by 子句中既不包含dom_amount 也不包含trans_date,因为这将导致这些字段的每个不同值都生成一个新的结果行...

    因此,您需要更改 order by 子句。

    只需从您的查询中删除它,它应该可以正常工作。同时删除over 子句。

    select 
        acct,
        year(trans_date) 'Year',
        month(trans_date) 'Month',
        sum(dom_amount) TotalBalance
    from ledger_mst
    where acct = 1100
    group by 
        acct,
        year(trans_date),
        month(trans_date)
    order by
        year(trans_date),
        month(trans_date)
    

    【讨论】:

    • 感谢您的及时回复!如果 group by 中没有 dom_amount,我会收到此错误:Msg 8120, Level 16, State 1, Line 6 列 'ledger_mst.dom_amount' 在选择列表中无效,因为它既不包含在聚合函数或 GROUP BY 子句中。
    • 您好@ChrisL,您确定您正在运行与我在答案中输入的完全相同的查询吗?我在select 子句中的唯一dom_amount 位于第5 行(不是第6 行),它是聚合函数(sum)的一部分。
    • 我刚刚复制了您的确切查询,但我现在仍然收到相同的错误,除了第 5 行。第 1 行我有用于选择我想使用的数据库的 use 子句是昨天运行的。 over 子句会破坏聚合函数吗?如果我注释掉 over 子句,结果是 39 行,正如预期的那样。
    • @ChrisL 好吧,那将是我的下一次尝试......我认为你不需要 over 子句来满足你的需要。只是相应地编辑了我的答案。谢谢!
    • over 子句对于给我一个运行总计是必要的。如果有一种方法可以将当前行与上一行相加,这可能会从 dom_amount 的总和中起作用,我只是不需要详细信息。
    猜你喜欢
    • 2021-05-05
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多