0

リソースの予約のデータベース (postgres 9.3 で実行) があります。このデータベースには、他の値の横に予約の開始時刻と終了時刻が含まれる予約テーブルが含まれています (としてtimestamp with time zone)

ここで、これらすべての予約を合計した合計時間の観点から、特定の会社が現在アクティブにしている予約の量を知る必要があります。

私は仕事をする次のクエリをまとめました:

SELECT EXTRACT(EPOCH FROM Sum(stop-start))/3600 AS total 
    FROM (reservations JOIN partners ON partner = email) 
    WHERE stop > now() AND company = 'givencompany'

これは、指定された会社が将来予約を持っている場合に非常にうまく機能します。私が経験している問題は、会社が予約を持っていない場合、クエリは実際には行を返しますが、列は空ですが、行をまったく返さない(または何も複雑でない場合totalは行を含む)ことです。0その場合。

これは、データベースに別の変更を加えることで実現できますか?それともSELECT、消費するアプリケーションがnull毎回チェックする必要がありますか?

私の質問が些細なことで申し訳ありませんが、私はデータベースにまったく慣れていません


編集

0を使用して戻り値をデフォルトにできることがわかりましたがCOALESCE、行が返されない場合はそれを好むでしょう

4

1 に答える 1

1

簡単な答えHAVING Sum(stop-start) IS NOT NULL:クエリの最後に追加するだけです。

長い答え: このクエリには明示的な はありませんGROUP BYが、行を で集約するため、条件に一致するすべての行を 1 つのグループとしてsum()暗黙的にクエリに変換されます。GROUP BYWHERE

SELECT に関するドキュメントを参照してください。

GROUP BY を使用しない場合、集計は、選択されたすべての行にわたって計算された単一の値を生成します。

HAVING 句について:

GROUP BY 句がない場合でも、HAVING が存在すると、クエリがグループ化されたクエリになります。これは、クエリに集計関数が含まれているが GROUP BY 句が含まれていない場合と同じです。選択されたすべての行は 1 つのグループを形成すると見なされ、SELECT リストと HAVING 句は集計関数内からのみテーブルの列を参照できます。このようなクエリは、HAVING 条件が true の場合は 1 行を発行し、そうでない場合は 0 行を発行します。

于 2013-11-13T14:28:57.997 に答える