我正在通过PHP制作销售报告。交易日期和时间位于LastUpdateTime
列,格式为:m-d-Y H:i:s
。现在我想报告1周,所以我需要1天内所有交易的TotalAmount总和,所以我使用DAY
的{{1}}组。这是我的代码,但它不起作用:
LastUpdateTime
返回错误:
列' Tickets.LastUpdateTime'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句
中
请帮助:)非常感谢你:))
答案 0 :(得分:2)
因此,您在选择查询中使用lastUpdateTime
和DATEPART(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子句的一部分
如果您希望执行查询,则下面的链接可能会对您有所帮助
答案 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
非常感谢大家