簡體   English   中英

從一個表進行MySQL查詢-兩次選擇同一字段

[英]MySQL Query from one table - Select same field twice

首先,我是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)。

希望我已經足夠清楚,如果不能,請原諒並告訴我是否需要更多信息。

預先感謝您可能提供的任何幫助。

編輯:回答保羅-每個建築物每個月只有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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM