GROUP BY日期时间SQL

时间:2016-03-17 05:07:33

标签: php sql

我正在通过PHP制作销售报告。交易日期和时间位于LastUpdateTime列,格式为:m-d-Y H:i:s。现在我想报告1周,所以我需要1天内所有交易的TotalAmount总和,所以我使用DAY的{​​{1}}组。这是我的代码,但它不起作用:

LastUpdateTime

返回错误:

  

列' Tickets.LastUpdateTime'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句

请帮助:)非常感谢你:))

3 个答案:

答案 0 :(得分:2)

因此,您在选择查询中使用lastUpdateTimeDATEPART(dd,LastUpdateTime),这是不同的。因此,对于超过1 lastUpdateTime,您可以拥有相同的DATEPART(dd,LastUpdateTime)。因此,如果按DATEPART(dd,LastUpdateTime)进行分组,那么您的数据库将无法知道它应该返回哪个lastUpdateTime

因此,在select query中使用max(lastUpdateTime)或任何其他聚合函数。

SELECT 
        SUM(TotalAmount) AS TotalPerDay 
        ,max(LastUpdateTime)
        ,DATEPART(dd,LastUpdateTime)
        FROM Tickets
        WHERE LastUpdateTime BETWEEN '$from_time' and '$to_time'
        GROUP BY DATEPART(dd,LastUpdateTime),
        LastUpdateTime 

或者将lastUpdateTime添加到group by子句中,但它不会给你预期的结果。

答案 1 :(得分:1)

要么使用..

SELECT      SUM(TotalAmount) AS TotalPerDay , DATEPART(dd,LastUpdateTime)
FROM        Tickets
WHERE       LastUpdateTime BETWEEN '$from_time' and '$to_time'
GROUP BY    DATEPART(dd,LastUpdateTime)

OR

SELECT      SUM(TotalAmount) AS TotalPerDay , DATEPART(dd,LastUpdateTime), LastUpdateTime
FROM        Tickets
WHERE       LastUpdateTime BETWEEN '$from_time' and '$to_time'
GROUP BY    LastUpdateTime
  

因为您无法通过选择在组中选择列/计算结果   声明,如果它不是group by子句的一部分

如果您希望执行查询,则下面的链接可能会对您有所帮助

Efficiently Include Column not in Group By of SQL Query

Select a Column in SQL not in Group By

答案 2 :(得分:0)

谢谢大家,我想出了我的解决方案

SELECT SUM(TotalAmount) AS TotalPerDay , CONVERT(VARCHAR(10),LastUpdateTime,103) AS TicketDateTime FROM Tickets WHERE LastUpdateTime BETWEEN '$from_time' and '$to_time' GROUP BY CONVERT(VARCHAR(10),LastUpdateTime,103)

我使用CONVERT代替DATEPART,然后我仍然有销售日期,仍然可以GROUP BY TotalAmount

非常感谢大家