2013-10-07 2 views
3

У меня есть таблица бронирования с 6 столбцами, называемыми забронированными, забронированными_стопами, used_start, used_stop, invoice_start, invoice_stop. Значения - это float. Я хочу получить сумму строк, которые имеют значения выше 0, но я также хочу, чтобы он вычислил say used_stop - used_start.Вычислить несколько значений с помощью sql с выражением

В настоящее время им работать с этим:

SELECT 
    room, 
    IF(booked_stop_time > 0, sum(booked_stop_time - booked_start_time), 0) as booked, 
    IF(used_stop_time > 0, sum(used_stop_time - used_start_time), 0) as used, 
    IF(invoice_stop_time > 0, sum(invoice_stop_time - invoice_start_time), 0) as invoice 
FROM bookings 

Проблема заключается в том, что если выражение1 возвращает ложь он будет сбросить сумму. Я хочу только добавить значение строки к сумме, если ее значение выше 0.

Я также попытался использовать футляр, но это действительно не работало. Может быть, я должен делать вычисления в php вместо этого?

ответ

2

Это должно работать:

SELECT 
    room, 
    SUM(
    CASE WHEN booked_stop_time - booked_start_time > 0 
     THEN booked_stop_time - booked_start_time 
     END 
) AS booked, 
    SUM(
    CASE WHEN used_stop_time - used_start_time > 0 
     THEN used_stop_time - used_start_time 
     END 
) AS used, 
    SUM(
    CASE WHEN invoice_stop_time - invoice_start_time > 0 
     THEN invoice_stop_time - invoice_start_time 
     END 
) AS invoice 
FROM bookings 

Ориентируясь на значение booked:

  • Если booked_stop_time - booked_start_time больше нуля в CASE возвращается booked_stop_time - booked_start_time, поэтому он включается в сумму.
  • CASE не имеет каких-либо других условий, так что если booked_stop_time - booked_start_time является не больше нуля, то возвращается NULL CASE, что означает, что строка не включается в сумму.
+0

Это прекрасно! Огромное спасибо :) –

0

Вы можете сделать это следующим образом:

SELECT 
    room, 
    SUM(IF(booked_stop_time > 0, booked_stop_time - booked_start_time, 0)) as booked, 
    SUM(IF(used_stop_time > 0, used_stop_time - used_start_time, 0)) as used, 
    SUM(IF(invoice_stop_time > 0, invoice_stop_time - invoice_start_time, 0)) as invoice 
FROM bookings

Это возвращает 0, потому что, когда ваше IF условие не удовлетворяло то, чтобы установить 0 как окончательное значение, так что просто обернуть IF с SUM.

0

Вы можете попробовать это

SELECT 
    room, 

    SUM( 
      IF(booked_stop_time > 0 and booked_start_time IS NOT NULL, 
         (booked_stop_time - booked_start_time), 0) 
    ) AS booked, 

    SUM( 
     IF(used_stop_time > 0 AND used_start_time IS NOT NULL, 
          (used_stop_time - used_start_time) , 0) 
    ) AS used, 

    SUM(
     IF(invoice_stop_time > 0 AND invoice_start_time IS NOT NULL, 
          (invoice_stop_time - invoice_start_time) , 0) 
     ) AS invoice 

WHERE booked_stop_time > 0 
OR used_stop_time > 0 
OR invoice_stop_time > 0 
Смежные вопросы