MySQL从一张表中查询 - 选择同一字段两次

标签 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 条线,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/

相关文章:

MySQL 和从 CSV 导入小数

php - 防止恶意外部脚本

excel - 在 Excel 中使用时间但忽略日期

mysql - 将 12 小时制时间格式转换为 24 小时制,如 mysql

java - 如何通过将它们转换为 long 来减去两次

mySQL 查询显示哪些 ID 有特定记录

mysql - 远程数据库访问(从 Parallels 电源面板)

matlab - 如何将一行的元素与同一矩阵中的每一行的元素进行比较

ios - 如何转换颜色?

c++ - 如何以 std::weak_ptr 作为键比较两个 std::map?