按月分组查询

时间:2017-08-19 06:52:30

标签: mysql sql

我使用group by month查询有问题。此查询每月返回total_revenue。但是如果一年中的某个月没有包含任何数据,那么total_revnue会不必要地增加。

SELECT COUNT(CT.cumTxnReportId),
   CT.cumTxnReportId,
   CT.ticketNum,
   DATE_FORMAT(CT.exitDateTimeUtc,'%m-%Y'),
   sum(netAmount) AS total_revenue,
   D.name,
   HOUR(CT.entranceDateTimeUtc) AS entryHour,
   HOUR(CT.exitDateTimeUtc) AS exitHour,
   CT.entranceDateTimeUtc,
   CT.exitDateTimeUtc,
   CT.netAmount AS netAmount,
   CT.grossAmount,
   CT.discountAmount,
   CT.rate,
   CT.txnType,
   CT.ticketType,
   CT.txnNum,
   CT.numDiscounts
FROM Parkloco.ParkingArea PA
JOIN IParcPro.Device D ON PA.id = D.parkingAreaId
JOIN Parkloco.RateCard RC ON PA.id = RC.parkingAreaId
JOIN IParcPro.CumTxn CT ON D.id = CT.deviceId
WHERE PA.uuid = '27d842c1-7057-11e6-a0eb-1245b0d35d23'
  AND (CT.txnType = 'Allowed'
       OR CT.txnType = 'Add'
       OR CT.txnType = 'Normal'
       OR CT.txnType = 'Offline'
       OR CT.txnType = 'Repay')
  AND ((CT.entranceDateTimeUtc >= '2016-08-01 00:00:00'
        AND CT.exitDateTimeUtc <= '2017-04-31 23:59:59'))
  AND (RC.state = 'active'
       OR RC.state = 'archived')
  AND RC.fromDateTimeUtc <= '2017-04-31 23:59:59'
  AND (RC.thruDateTimeUtc IS NULL
       OR RC.thruDateTimeUtc >= '2016-08-01 00:00:00')
  AND (TIMESTAMPDIFF (SECOND, CT.entranceDateTimeUtc, CT.exitDateTimeUtc) >= '0' * 60)
  AND (TIMESTAMPDIFF (SECOND, CT.entranceDateTimeUtc, CT.exitDateTimeUtc) < '1441' * 60)
  AND CT.numDiscounts=0
  AND CT.ticketNum !=0
GROUP BY DATE_FORMAT(CT.exitDateTimeUtc,'%m-%Y')

enter image description here

但是当我增加范围月份时 - 在那个时间点我在total_revenue

中增加了不必要的增量
SELECT COUNT(CT.cumTxnReportId),
   CT.cumTxnReportId,
   CT.ticketNum,
   DATE_FORMAT(CT.exitDateTimeUtc,'%m-%Y'),
   sum(netAmount) AS total_revenue,
   D.name,
   HOUR(CT.entranceDateTimeUtc) AS entryHour,
   HOUR(CT.exitDateTimeUtc) AS exitHour,
   CT.entranceDateTimeUtc,
   CT.exitDateTimeUtc,
   CT.netAmount AS netAmount,
   CT.grossAmount,
   CT.discountAmount,
   CT.rate,
   CT.txnType,
   CT.ticketType,
   CT.txnNum,
   CT.numDiscounts
FROM Parkloco.ParkingArea PA
JOIN IParcPro.Device D ON PA.id = D.parkingAreaId
JOIN Parkloco.RateCard RC ON PA.id = RC.parkingAreaId
JOIN IParcPro.CumTxn CT ON D.id = CT.deviceId
WHERE PA.uuid = '27d842c1-7057-11e6-a0eb-1245b0d35d23'
  AND (CT.txnType = 'Allowed'
       OR CT.txnType = 'Add'
       OR CT.txnType = 'Normal'
       OR CT.txnType = 'Offline'
       OR CT.txnType = 'Repay')
  AND ((CT.entranceDateTimeUtc >= '2016-08-01 00:00:00'
        AND CT.exitDateTimeUtc <= '2017-07-31 23:59:59'))
  AND (RC.state = 'active'
       OR RC.state = 'archived')
  AND RC.fromDateTimeUtc <= '2017-07-31 23:59:59'
  AND (RC.thruDateTimeUtc IS NULL
       OR RC.thruDateTimeUtc >= '2016-08-01 00:00:00')
  AND (TIMESTAMPDIFF (SECOND, CT.entranceDateTimeUtc, CT.exitDateTimeUtc) >= '0' * 60)
  AND (TIMESTAMPDIFF (SECOND, CT.entranceDateTimeUtc, CT.exitDateTimeUtc) < '1441' * 60)
  AND CT.numDiscounts=0
  AND CT.ticketNum !=0
GROUP BY DATE_FORMAT(CT.exitDateTimeUtc,'%m-%Y')

输出如:

enter image description here 谁可以帮我这个事?如果您能告诉我,请提前致谢。

1 个答案:

答案 0 :(得分:2)

尽管MySQL允许这种奇怪的group by规则,但在我看来,你应该避免使用它。我通常会解释所有select clause非聚合字段应出现在group by子句:

select a,b,c, sum(z)
from t
group by a,b,c

VS

select a,b,c, sum(z)
from t
group by a   #<--- MySQL allow this!

然后,如果bc不在分组中,MySQL如何确定要选择的正确字段? Like this on <5.6

  

服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。

在我看来,您的查询毫无意义:查看entryHourtotal_revenue。一个用于输入,另一个用于整个月。

我想你应该重新考虑一下这个洞的sql语句。因为这个结果是不连贯的。

另外,请记住这不是'代码修订服务'。请阅读how to create a Minimal, Complete, and Verifiable example,以便您的问题也可以帮助其他用户。