2012-04-03 73 views
1

我希望得到您對我無法在單個查詢中獲得的查詢的幫助。從同一表中抽取兩個SUM

 
Table timeaccount 

Field Type 
id  mediumint(8) --> Primary key autoincrement 
user varchar(40) --> user, e.g. 'john.fisher' 
type varchar(15) --> can only be 'SUM' or 'SUBSTRACT' 
minutes smallint(5) --> an amount of minutes 

這代表時間佔職工其中每個記錄說,一名工人(場「用戶」)多少分鐘已經添加或者(根據現場「類型」)從他的餘額中減去。

我只是想獲得一個單一的查詢從特定工人的平衡,在僞SQL將是:

 
select sum(minutes) from timeaccount where worker = 'john.fisher' and type = 'SUM' 
- 
select sum(minutes) from timeaccount where worker = 'john.fisher' and type = 'SUBSTRACT' 

as balance 

感謝您的幫助,

回答

3

或者:

SELECT SUM(minutes * case type when 'SUBTRACT' then -1 else 1 end) AS balance 
FROM timeaccount 
WHERE worker = 'john.fisher' and type in ('SUM','SUBTRACT') 
+0

我非常喜歡使用乘法逆轉技巧的優雅使用只有一個SUM,我期望有比使用兩個SUM更好的性能,這就是爲什麼我把你的答案標記爲Accepted,儘管我非常感謝MichaelRushton和我也從其他人那裏學到了答案。謝謝! – Nelson 2012-04-03 10:50:33

+0

此外,您正在使用的情況下,IF將足夠,但我很欣賞它作爲'類型'可能有不止兩個可能值的情況的有用示例。 – Nelson 2012-04-03 11:02:05

6
SELECT 
    SUM(IF(type = 'SUM', minutes, 0)) - 
    SUM(IF(type = 'SUBTRACT', minutes, 0)) AS balance 
FROM timeaccount 
WHERE worker = 'john.fisher' 
+0

在第二個SUM中,您將分鐘寫爲字符串(帶引號)。該查詢可能不會工作 – 2012-04-03 09:44:09

+0

愚蠢的我。謝謝。 – MichaelRushton 2012-04-03 09:44:33

+0

Upvoted this,thank you。 – Nelson 2012-04-03 11:05:41

0

試試這個:

select sum(if(type = 'SUM', minutes, 0)) - sum(if(type = 'SUBSTRACT', minutes, 0)) as balance from timeaccount where worker = 'john.fisher' 
2
SELECT (SUM_VAL - SUBSTRACT_VAL) as balance FROM 
(
select sum(minutes) AS SUM_VAL FROM timeaccount WHERE worker = 'john.fisher' AND type =  'SUM', 
select sum(minutes) AS SUBSTRACT_VAL FROM timeaccount WHERE worker = 'john.fisher' AND type = 'SUBSTRACT' 
) t1 
+1

我認爲@MichaelRushton的ansswer更易於維護(可讀性更強,理解更快),但這是用不同表格做類似事情的好方法。從第一行的TIMEACCOUNT和第二行的LUNCH。 – Karl 2012-04-03 10:34:11

+1

正如Karl所指出的,Upvoted提供了一個可用於類似問題的替代解決方案。 – Nelson 2012-04-03 11:05:13

相關問題