mysql运行总计,按日期排序

时间:2017-11-13 15:20:24

标签: mysql

我一直在尝试按日期排序#34;按顺序排序"。问题是如果你有两个具有相同日期的条目,那么它在两行上都显示相同的总数。

表结构是这样的

sipID|Date|Amount
1|2017-11-07|2
2|2017-11-09|27
3|2017-11-07|24

所以我知道如何通过这样的id来运行总计。

SELECT `sipID`,DATE_FORMAT(`Date`,'%d %M %Y') as `DateFormat`,`Amount`,
(SELECT SUM(`Amount`) FROM `salesinvoice_payments` as `Lin` WHERE `Lin`.`sipID`<=`Lout`.`sipID` && `salesinvoice_id`=115) as `Balance`
FROM `salesinvoice_payments` as `Lout`
WHERE `salesinvoice_id`=115
ORDER BY `sipID`

但是我希望它按日期升序排序,所以我做了这个

SELECT `sipID`,DATE_FORMAT(`Date`,'%d %M %Y') as `DateFormat`,`Amount`,
(SELECT SUM(`Amount`) FROM `salesinvoice_payments` as `Lin` WHERE `Lin`.`Date`<=`Lout`.`Date` && `salesinvoice_id`=115) as `Balance`
FROM `salesinvoice_payments` as `Lout`
WHERE `salesinvoice_id`=115
ORDER BY `Date` ASC

现在这确实有效。如果您有2行具有相同的日期,则会发生此问题。那么会发生两行具有相同的运行总量。 例如

07 November 2017    2.00    24.00
07 November 2017    22.00   24.00
09 November 2017    3.00    27.00

我想要的是这个

07 November 2017    2.00    2.00
07 November 2017    22.00   24.00
09 November 2017    3.00    27.00

是否有解决方法以便我可以拥有正确的运行总数,并按日期排序,而不会在同一天获得相同的总数?

编辑: @草莓: 我终于弄清楚了sqlfiddle是如何工作的,并把它作为我原来的问题。 http://www.sqlfiddle.com/#!9/c6dc75/1

2 个答案:

答案 0 :(得分:2)

你需要一些东西来将Ammount从同一天分开。

SQL DEMO

SELECT `sipID`,
        DATE_FORMAT(`Date`,'%d %M %Y') as `DateFormat`,
        `Amount`,
         (SELECT SUM(`Amount`) 
          FROM `salesinvoice_payments` as `Lin` 
          WHERE `Lin`.`Date` < `Lout`.`Date` 
            OR  (`Lin`.`Date` = `Lout`.`Date` 
                 AND `Lin`.`sipID` <= `Lout`.`sipID`)
          ) as `Balance`
FROM `salesinvoice_payments` as `Lout`
ORDER BY `Date` ASC

<强>输出

enter image description here

答案 1 :(得分:1)

使用用户变量的方法:DEMO与Juan点头以设置表/数据

SELECT `sipID`
     , DATE_FORMAT(`Date`,'%d %M %Y') as `DateFormat`
     ,`Amount`
     ,@Bal:=@Bal+`amount` as `Balance`
FROM `salesinvoice_payments` as `Lout`
CROSS JOIN (SELECT @Bal:=0) z --initializes and declares variable in select
WHERE `salesinvoice_id`=115
ORDER BY `Date`, `sipID`

或使用分页

SELECT * 
FROM (SELECT `sipID`
           , DATE_FORMAT(`Date`,'%d %M %Y') as `DateFormat`
           ,`Amount`
           ,@Bal:=@Bal+`amount` as `Balance`
      FROM `salesinvoice_payments` as `Lout`
      CROSS JOIN (SELECT @Bal:=0) z --initializes and declares variable in select
      WHERE `salesinvoice_id`=115
      ORDER BY `Date`, `sipID`) Z
ORDER BY `DateFormat`, `sipID`
LIMIT 5,10;  -- Retrieve rows 6-15  Skip 5 retrieve next 10.

在这种方法中,变量已在集合{Z}中解析,因此用户变量不受限制/偏移的影响。

Example using your SQL Fiddle但我们需要更多样本数据来真正看到分页影响。