来自一个表的MySQL查询 - 选择相同的字段两次

时间:2016-08-26 14:17:56

标签: mysql time comparison

首先,我是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 - 您的答案正是我所寻找的:)感谢您的时间。

1 个答案:

答案 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