2013-02-03 62 views
2

以下是我用來從三個不同「地址」中收集每日值的查詢,這些地址引用了系統中的不同傳感器。格式化SQL結果作爲總和

SELECT DISTINCT 
    LEFT(changes.date_time, 6) AS 'date', 
    changes.address AS 'address', 
    (CASE WHEN changes.address IN (18) THEN - MAX(changes.value * types.multiplier) ELSE MAX(changes.value * types.multiplier) END) AS 'value' 
FROM sensor.changes 
INNER JOIN sensor.types ON changes.type = types.idx 
WHERE 
    changes.address IN (1, 4, 8) 
    AND changes.date_time >= '12110100000000' 
    AND changes.date_time <= '13050100000000' 
GROUP BY LEFT(changes.date_time, 6), 
    changes.address 
ORDER BY changes.idx; 

第一次約會包含以下值,隨後日期攜帶相同地址:

date address value 
130203 1  0.0160 
130203 4  0.1220 
130203 8  -0.0070 

我想這三個值結合起來,地址1 + 4 + 8,成單列的那個日期。我已經在「值」列上嘗試了一個SUM,但是這會導致SQL錯誤:#1111 - Invalid use of group function。取出第二個GROUP BY列會導致每個日期有一個值,但該值不是這些值的總和。使用第二個查詢來格式化結果是可以的,但我更喜歡數學是否在第一個查詢中完成,因爲數據庫服務器不是本地的。

編輯:澄清什麼,我需要的結果是:

date address value 
130203 1  0.131 

在這種情況下,address列下的整數無所謂。

+0

'value'是什麼?你的輸出應該是什麼樣子? (提示:_只是添加一個「GROUP BY日期」,儘管MySQL會允許你) –

+0

謝謝,我已經添加了期望的結果。幾乎所有的查詢都使用第一個「GROUP BY」列,因爲每天每個地址實際上有很多值。 –

回答

2

您應該添加一個分組子句。

SELECT Resdate,SUM(Res.address),SUM(Res.value) 
FROM 
(
SELECT DISTINCT 
    LEFT(changes.date_time, 6) AS 'date', 
    changes.address AS 'address', 
    (CASE WHEN changes.address IN (18) THEN - MAX(changes.value * types.multiplier) ELSE MAX(changes.value * types.multiplier) END) AS 'value' 
FROM sensor.changes 
INNER JOIN sensor.types ON changes.type = types.idx 
WHERE 
    changes.address IN (1, 4, 8) 
    AND changes.date_time >= '12110100000000' 
    AND changes.date_time <= '13050100000000' 
GROUP BY LEFT(changes.date_time, 6), 
    changes.address 
ORDER BY changes.idx 
) AS Res 
GROUP BY Res.Date 
+0

謝謝!通過對語法進行一些微小的調整,這可以很好地工作。 –

+0

@AndrewBestic - 很高興幫助:) – MuhammadHani