2009-09-10 3 views
2

У меня есть таблица, которая содержит интервалы:Как я могу агрегировать два класса значений в SQL-запросе?

CREATE TABLE tbl (
    user_id: INTEGER, 
    start: TIMESTAMP, 
    end: TIMESTAMP, 
    billable: BOOLEAN 
); 

Я хочу, чтобы создать представление, которое выглядит следующим образом:

user_id | billable_time | unbillable_time 

я могу получить один из этих двух, используя запрос, как это:

SELECT user_id, sum(end - start) AS billable_time WHERE billable = TRUE GROUP BY user_id; 

Однако, мне нужно оба колонок, с НЕОПЛАЧИВАЕМЫМ временем является эквивалентом:

SELECT user_id, sum(end - start) AS unbillable_time WHERE billable = FALSE GROUP BY user_id; 

Как я могу получить эти два значения в одном запросе?

ответ

3
select user_id, sum(case billable when 1 then (end - start) end) as can_bill, 
    sum(case billable when 0 then (end - start) end) as unbillable 
+0

То, что дает мне эту ошибку: ОШИБКА: синтаксическая ошибка при или около "CASE" LINE 1: ... (CASE оплачивается КОГДА ИСТИНА ТОГО закончилось - начато КОНЕЦ CASE) AS p ... –

+0

Все, что вам нужно сделать, это изменить 'end case'' end', и он работает. Благодаря! –

+0

Извините, я использовал ошибку MySQL в хранимой процедуре по ошибке. – dnagirl

0
SELECT user_id, billable, sum(end - start) AS billable_time 
GROUP BY user_id,billable; 
+0

Это не совсем то, что я искал. Я думал, что это очевидно, но я полагаю, что мне лучше прояснить вопрос. –

+0

быстрее и проще выполнять презентацию на прикладном уровне. Мой другой ответ даст вам макет, который вы хотите, за счет скорости. – dnagirl

+0

Согласен. Тем не менее, мне сказали «Поместить его в базу данных» Итак, это либо это, либо задание cron для обновления таблицы с той же структурой. Фу. –

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