mysql运行总计,按日期排序

mysql运行总计,按日期排序,mysql,Mysql,我一直在试着按日期完成一个总订单。问题是,如果有两个条目的日期相同,则两行上显示的总数相同 表结构是这样的 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 `salesinvoi

我一直在试着按日期完成一个总订单。问题是,如果有两个条目的日期相同,则两行上显示的总数相同

表结构是这样的

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`
我想要的是这个

07 November 2017    2.00    2.00
07 November 2017    22.00   24.00
09 November 2017    3.00    27.00
是否有一个解决办法,使我可以有一个适当的运行总数,并有它的订单日期没有得到相同的总数在同一天

编辑: @草莓: 我终于找到了SQLFIDLE的工作原理,并将此作为我最初的问题。

你需要一些东西来把一个月和同一天分开

输出


你需要一些东西把阿蒙特和同一天分开

输出


使用用户变量的方法:向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}中解析,因此用户变量不受限制/偏移的影响


但是我们需要更多的示例数据才能真正看到分页的影响。

使用用户变量的方法:向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}中解析,因此用户变量不受限制/偏移的影响



但我们需要更多的样本数据才能真正看到分页的影响。

看起来您已经有了运行总数,但您希望将其分解为原始部分。您好,Tim,我的第二个查询给出了该日期的运行总数,但因为有两个日期相同,所以两个日期的总数相同。我知道它为什么这样做,但我宁愿它没有你的数据样本字段与你的查询字段不匹配如果你有两个相同日期的订单,你想要哪一个?您可以有运行总计2,24和22,24。看起来您已经有了运行总计,但您希望将其分解为原始部分。您好,Tim,我的第二个查询给出了该日期的运行总数,但因为有两个日期相同,所以两个日期的总数相同。我知道它为什么这样做,但我宁愿它没有你的数据样本字段与你的查询字段不匹配如果你有两个相同日期的订单,你想要哪一个?您可以将运行总数设置为2,24和22,24这可能具有更好的性能。而不是多个子查询只是一个表扫描。OP应该测试两者。啊,但我们从不关心性能!:P让它先工作,然后笑。。。那就把它做好。。。那就让它变得更好。嗨,xQbert。之后我会试试你的,但我是在mysql php中这样做的,在这种情况下,变量往往不能很好地工作。另外,我认为变量不会与我的分页子句一起工作。嗨,xQbert,我知道你的方法不太密集,但在查询分页后,我通常会有一个限制,例如第一页上可能是0,10,然后在第二页上更改。因此,通过在第二页上使用变量,我将丢失第一页上的结果。无论如何,我在分页中一次只列出10个项目,所以它不会对性能造成重大影响。我可以在项目中使用您的代码,而无需分页。您可以将查询包装在查询中进行分页。因此,将计算整个集合,然后分页将在派生表中生成余额的集合上生效,并且用户变量不再相关。始终使用适合你和你的情况的工具!这两种方法都是对问题的回答,而且似乎都有效。我真的不知道这是否会更快。它使用较少的查询,但我确信派生表和两次排序会有代价。祝你好运!这可能有更好的性能。而不是多个子查询只是一个表扫描。OP应该测试两者。啊,但我们从不关心性能!:P让它先工作,然后笑。。。那就把它做好。。。那就让它变得更好。嗨,xQbert。之后我会试试你的,但我是在mysql php中这样做的,在这种情况下,变量往往不能很好地工作。另外,我认为变量不会与我的分页子句一起工作。嗨,xQbert,我知道你的方法不太密集,但在查询分页后,我通常会有一个限制,例如第一页上可能是0,10,然后在第二页上更改。因此,通过在第二页上使用变量,我将丢失第一页上的结果。无论如何,我在分页中一次只列出10个项目,所以它不会对性能造成重大影响。我可以在项目中使用您的代码,而无需分页。您可以将查询包装在查询中进行分页。因此,将计算整个集合,然后分页将在派生表中生成余额的集合上生效,并且用户变量不再相关。始终使用适合你和你的情况的工具!这两种方法都是对问题的回答,而且似乎都有效。我真的很高兴 我不知道这是否会更快。它使用较少的查询,但我确信派生表和两次排序会有代价。祝你好运!
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.