首先,我是 MySQL 的新手,如果我要问一些已经在不同“术语”下得到回答的问题,我深表歉意。我已经寻找这个问题的解决方案一个多星期了,但我无法想出一个解决方案,可能是因为我没有使用正确的关键字。请容忍我和我在这个意义上的无知:)
我有一个包含以下字段的表:
ID int(11) NO PRI auto_increment
Building int(11) YES MUL
CounterNo int(11) YES MUL
ReadingDate datetime YES
StartMeter int(11) YES
EndMeter int(11) YES
CostKw decimal(10,6) YES
Multiplier smallint(3) YES
我想进行一个查询,我将用它来填充比较折线图,它将返回以下内容:
Building | Cons1 | Cons2 | Month
1 1year ybefore Month
然后使用月份名称填充 X 轴,Cons1 是去年每个建筑物每个月的消耗量,而 Cons2 是前一年每个建筑物每个月的消耗量.
我已经开始尝试了,到目前为止我已经完成了以下操作:
SELECT Building,
CASE
WHEN ReadingDate >= DATE_SUB(NOW(), INTERVAL 1 YEAR)
THEN (EndMeter - StartMeter)
ELSE NULL
END
AS 'Cons1',
CASE
WHEN ReadingDate BETWEEN DATE_SUB(NOW(), INTERVAL 2 Year) AND DATE_SUB(NOW(), INTERVAL 1 Year)
THEN (EndMeter - StartMeter)
ELSE NULL
END
AS 'Cons2',
CONCAT(
MONTHNAME (
tblElectricReadings.ReadingDate
)
) AS MonthRecorded
FROM tblElectricReadings
WHERE ReadingDate >= DATE_SUB(NOW(), INTERVAL 2 YEAR)
ORDER BY ReadingDate
这会产生我想要的结果,但它不会“合并”(再次,抱歉,如果我在这里用错了词)Cons1和Cons2在一起,而是将空值放入任一字段,从而创建双倍我需要的记录。基本上,查询工作正常,但这不是我想要的结果。我希望 Cons1 和 Cons2 都根据每个月填充相关消费,以便我可以相应地填充折线图(有 2 条线,1 条用于 Cons1,另一条用于 Cons2)。
我希望我已经说得足够清楚了,如果不够清楚,请原谅我,并告诉我您是否需要更多信息。
预先感谢您提供的任何帮助。
编辑:回答 Paul - 每栋建筑每个月只有 1 个条目,所以这不是问题。但感谢您注意到这一点!还要感谢 xQbert - 你的答案正是我一直在寻找的:) 谢谢你的时间。
最佳答案
因为我们知道每条记录都有一个空值,所以使用最大值(或最小值)消除空记录值并将结果合并到一行/记录中。
SELECT Building,
max(CASE
WHEN ReadingDate >= DATE_SUB(NOW(), INTERVAL 1 YEAR)
THEN (EndMeter - StartMeter)
ELSE NULL
END)
AS 'Cons1',
max(CASE
WHEN ReadingDate BETWEEN DATE_SUB(NOW(), INTERVAL 2 Year) AND DATE_SUB(NOW(), INTERVAL 1 Year)
THEN (EndMeter - StartMeter)
ELSE NULL
END)
AS 'Cons2',
CONCAT(
MONTHNAME (
tblElectricReadings.ReadingDate
)
) AS MonthRecorded
FROM tblElectricReadings
WHERE ReadingDate >= DATE_SUB(NOW(), INTERVAL 2 YEAR)
GROUP BY Building, CONCAT(MONTHNAME(tblElectricReadings.ReadingDate))
ORDER BY ReadingDate
关于MySQL从一张表中查询 - 选择同一字段两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39168461/