【问题标题】:Cumulative sum with max date group by month year and id按月年和 id 的最大日期组的累积和
【发布时间】:2018-09-01 03:30:57
【问题描述】:

现在我需要进行类似的查询,但需要几个条件 这是我的桌子

`transaksi` (`transid`, `idpinj`, `tanggal`,`sisapokok`, `sisajasa`
(1, 1, '2018-01-01', 1000, 100, 1),
(2, 1, '2018-01-05', 1000, 100, 3),
(3, 2, '2018-02-04', 1000, 100, 4),
(4, 2, '2018-02-08', 1000, 100, 5),
(5, 1, '2018-02-19', 1000, 100, 3),
(6, 3, '2018-02-22', 1000, 100, 2),
(7, 2, '2018-03-09', 1000, 100, 3),
(8, 3, '2018-03-10', 1000, 100, 3)
(9, 3, '2018-03-12', 1000, 100, 4)
(10, 1, '2018-03-17', 1000, 100, 4)
(11, 4, '2018-03-19', 1000, 100, 3)
(12, 2, '2018-03-20', 1000, 100, 4)

DB Fiddle table

从上表我需要得到如下输出

Month         sisapokok    sisajasa
Jan-2018      1000         100       ->row2
Feb-2018      4000         400       ->+ row3+5
Mar-2018      12000        1200      ->+ row9+10+11+12   
  • 首先,我需要为每个 idpinj 获取 sum(sisapokok) 和 sum(sisajasa),其中日期为 max(tanggal),状态介于 3 和 4 之间。然后该值总计为每月总和
  • 过去 12 个月每个月的累计金额

我尝试了这个查询,但它从所有记录中获取 max(date),而不是按月和每个 idpinj 获取 max(date)。

SELECT  a.idpinj,a.sisapokok
FROM    transaksi a
        INNER JOIN 
        (
            SELECT  idpinj, MAX(tanggal) tgl
            FROM    transaksi
            GROUP BY idpinj
        ) b ON a.idpinj = b.idpinj
                AND a.tanggal = b.tgl  
ORDER BY `a`.`idpinj` ASC

【问题讨论】:

  • 很遗憾dbfiddle数据与问题数据或预期结果不匹配。

标签: mysql sql date


【解决方案1】:

基于小提琴数据

select yyyy,mm,
        @s:=@s+sisapokok sisapokok,
        @t:=@t+sisajasa sisajasa
from
(
select yyyy,mm,sum(sisapokok) sisapokok,sum(sisajasa) sisajasa
from
(
select year(tanggal) yyyy,month(tanggal) mm, sisapokok,sisajasa
from transaksi t
join
(
select year(tanggal) yyyy,month(tanggal) mm,idpinj,max(transid) maxid
from `transaksi`
where status in(3,4)
group by year(tanggal),month(tanggal),idpinj
) s on s.maxid = transid
) t
group by yyyy,mm
) u
,(select @s:=0,@t:=0) r
order by yyyy,mm

+------+------+-----------+----------+
| yyyy | mm   | sisapokok | sisajasa |
+------+------+-----------+----------+
| 2018 |    1 |      2000 |     2003 |
| 2018 |    2 |      5000 |     2303 |
| 2018 |    3 |     13000 |     3103 |
+------+------+-----------+----------+
3 rows in set (0.00 sec)

请注意,内部查询会找到最后一个相关的 id,并且代码会向外执行以使用变量来计算运行总计。

【讨论】:

    【解决方案2】:

    不确定您的具体要求,但看看这是否有帮助:

    select monthyear, sum(sisapokok)sisapokok, sum(sisajasa)sisajasa from (
    select   cast(month(tanggal) as varchar)+'-'+cast(year(tanggal) as varchar) monthyear, sum(sisapokok)sisapokok, sum(sisajasa)sisajasa
    from #transaksi
     group by  cast(month(idpinj) as varchar)+'-'+cast(year(tanggal) as varchar) , tanggal) a
     group by monthyear
    

    【讨论】:

    • 尝试查询并将 varchar 替换为 char 但仍然出现错误“near group by cast....
    • 你在使用 SQL Server 吗?
    • 不,我正在使用 MySQL
    • OK 尝试使用 'extract' 而不是 month() 和 year()
    • + 是一个sql server concat函数只用concat
    猜你喜欢
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    相关资源
    最近更新 更多