在Microsoft Access

时间:2017-09-25 14:43:37

标签: mysql ms-access

逗人,

毋庸置疑,我一直在不遗余力地将一个在MySQL工作中完美运行的查询转化为Microsoft Access。我有一些例外。

这是一个比较查询,应该确实比较同一个月的电力消耗,包括当前年份和前一年的电力消耗,按建筑分组。

正如我所说,它在MySQL中运行得很好,但在MS Access中却不行。

原始查询:

SELECT
tblElectricReadings.Building,
SUM(CASE WHEN tblElectricReadings.ReadingDate >= DATE_SUB(NOW(), INTERVAL 1 YEAR) THEN (tblElectricReadings.EndMeter - tblElectricReadings.StartMeter) ELSE NULL END) AS 'Cons1',
SUM(CASE WHEN tblElectricReadings.ReadingDate BETWEEN DATE_SUB(NOW(), INTERVAL 2 YEAR) AND DATE_SUB(NOW(), INTERVAL 1 YEAR) THEN (tblElectricReadings.EndMeter - tblElectricReadings.StartMeter) ELSE NULL END) AS 'Cons2',
CONCAT(MONTHNAME(tblElectricReadings.ReadingDate)) AS MonthRecorded 
FROM tblElectricReadings
WHERE   tblElectricReadings.ReadingDate >= DATE_SUB(NOW(), INTERVAL 2 YEAR)
GROUP BY tblElectricReadings.Building,
CONCAT(MONTHNAME(tblElectricReadings.ReadingDate))
ORDER BY tblElectricReadings.ReadingDate, tblElectricReadings.Building

我意识到MS Access SQL有点不同,所以我在潜伏着互联网之后尝试了一些变化。 这是我能得到的最接近,但它仍然无法工作:

SELECT
tblElectricReadings.[Building],
SUM(IIF(tblElectricReadings.[Reading Date] >= DATEADD("y",-1,NOW()), (tblElectricReadings.[End Meter] - tblElectricReadings.[Start Meter]),0)) AS 'Cons1',
SUM(IIF(tblElectricReadings.[Reading Date] BETWEEN DATEADD("y",-2,NOW()) AND DATEADD("y",-1,NOW()), (tblElectricReadings.[End Meter] - tblElectricReadings.[Start Meter]),0)) AS 'Cons2',
MONTHNAME(tblElectricReadings.[Reading Date]) AS MonthRecorded
FROM tblElectricReadings
WHERE tblElectricReadings.[Reading Date] >= DATEADD("y",-2,NOW())
GROUP BY tblElectricReadings.[Building], MONTHNAME(tblElectricReadings.[Reading Date])
ORDER BY tblElectricReadings.[Reading Date], tblElectricReadings.[Building]

通过上述内容,我现在收到以下错误:"您的查询不包含指定的表达式' tblElectricReadings。[阅读日期]'作为集合函数的一部分。

有没有人有任何线索我做错了什么?任何帮助当然会非常感激:)如果我要问一些简单的事情,请道歉,但我仍然在这里学到很多东西:(

感谢您提供的任何最终帮助。

编辑3:我管理了!这对我有用 - 感谢所有提供的帮助,感谢。

SELECT 
tblElectricReadings.[Building], 
MONTHNAME(MONTH(tblElectricReadings.[Reading Date])) AS MonthRecorded, 
SUM(IIF(tblElectricReadings.[Reading Date] >= DATEADD("yyyy",-1,NOW()), (tblElectricReadings.[End Meter] - tblElectricReadings.[Start Meter]),0)) AS [Current Year Consumption], 
SUM(IIF(tblElectricReadings.[Reading Date] BETWEEN DATEADD("yyyy",-2,NOW()) AND DATEADD("yyyy",-1,NOW()), (tblElectricReadings.[End Meter] - tblElectricReadings.[Start Meter]),0)) AS [Previous Year Consumption]
FROM tblElectricReadings
WHERE tblElectricReadings.[Reading Date] >= DATEADD("yyyy",-2,NOW())
GROUP BY tblElectricReadings.[Building], MONTH(tblElectricReadings.[Reading Date])
ORDER BY MONTH(tblElectricReadings.[Reading Date]), tblElectricReadings.[Building];

1 个答案:

答案 0 :(得分:0)

不确定这是唯一的问题,但

SUM(IIF(tblElectricReadings.ReadingDate >= DATEADD("y",-1,NOW()), (tblElectricReadings.EndMeter - tblElectricReadings.StartMeter),"")

显然是错误的:你不能SUM Strings,即使是空的。请尝试改为:

SUM(IIF(tblElectricReadings.ReadingDate >= DATEADD("y",-1,NOW()), (tblElectricReadings.EndMeter - tblElectricReadings.StartMeter),0)

对其他事件也这样做。

修改

我还认为你的ORDER BY子句没有意义,因为它试图对输出数据集中不存在的东西进行排序。它应该是:

ORDER BY MONTHNAME(tblElectricReadings.ReadingDate), tblElectricReadings.Building