首先,我是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行,Cons1为1,Cons2为1)。
我希望我已经足够清楚,如果没有请原谅我并告诉我你是否需要进一步的信息。
提前感谢您提供的任何帮助。
编辑:回答保罗 - 每个建筑物每个月只有1个条目,所以这不是问题。但感谢您注意到!还要感谢一百万到xQbert - 您的答案正是我所寻找的:)感谢您的时间。
答案 0 :(得分:0)
因为我们知道每条记录都有一个空值,使用max(或min)消除了空记录值,并将结果组合成一行/记录。
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