2012-04-03 3 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, поэтому я отмечаю ваш ответ как Accepted, хотя я очень ценю MichaelRushton и другие ответы, как я узнал от них. Благодаря! – Nelson

+0

Также вы используете CASE, где IF было бы достаточно, но я ценю его как полезный пример ситуации, когда «тип» может иметь не более двух возможных значений. – Nelson

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

Во второй СУММ вы написали минуты как строку (с кавычками). запрос, вероятно, не будет работать –

+0

Глупый я. Благодарю. – MichaelRushton

+0

Приобретено это, спасибо. – Nelson

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

Я думаю, что ansswer by @MichaelRushton более удобен в обслуживании (читабельнее, быстрее понять), но этот способ - хороший способ сделать аналогичную вещь с разными таблицами, например. от TIMEACCOUNT для первой строки и от LUNCH для 2-го. – Karl

+1

Приобретено это для обеспечения альтернативного решения, которое может быть использовано в аналогичной проблеме, как отмечает Карл. – Nelson

Смежные вопросы