3

私は、booked_start、booked_stop、used_start、used_stop、invoice_start、invoice_stop という 6 つの列を持つ予約テーブルを持っています。値は float です。値が 0 を超える行の合計を取得したいのですが、used_stop - used_start なども計算したいと考えています。

現在、これで作業しています:

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

問題は、expr1 が false を返した場合、合計がリセットされることです。行の値が0を超える場合にのみ合計に追加したい.

私もケースを使ってみましたが、うまくいきませんでした。たぶん、代わりにphpで計算する必要がありますか?

4

3 に答える 3

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には他の条件がないため、 が 0 より大きくない場合、booked_stop_time - booked_start_timeNULLCASE返します。これは、その行が合計に含まれないことを意味します。
于 2013-10-07T13:28:32.810 に答える
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

IF条件が満たされない場合は0最終値として設定されるため、 0 を返すため、 IFwith をラップするだけSUMです。

于 2013-10-07T13:26:47.457 に答える