2013-02-03 64 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