0

Postgresql 9.1 を使用してデータベースを作成しています 与えられたテーブル:

CREATE TABLE rooms(
    room_number int,
    property_id int,
    type character varying,
    PRIMARY KEY (room_number, property_id)
);
Insert into rooms values (1,1,double),(2,1,double),(3,1,triple)

CREATE TABLE reservations(
    reservation_ID int,
    property_id int,
    arrival date,
    departure date,
    room_num int,
    PRIMARY KEY(reservation_ID,property_id)
    FOREIGN KEY (room_number, property_id)
);

INSERT INTO orders VALUES (1,1,2013-9-27,2013-9-30,1), 
                          (2,1,2013-9-27,2013-9-28,2),
                          (3,1,2013-9-29,2013-9-30,3);

2 つの日付を指定し、その間に空き状況を確認したいのですが。したがって、最初の列に次のように表示されます。

  1. 指定された ~ の間のすべての日付

  2. 空室状況を表示する部屋のタイプごとに 1 つの列が追加されます。

したがって、入力として 2013-9-27 と 2013-9-30 を指定すると、私の結果は次のようになります。

ここに画像の説明を入力

4

1 に答える 1

0

最善の解決策は、generate_series() と crosstab() の両方を使用して動的テーブルを作成することだと思います。さらに、CTE からデータ テーブルへの左結合を使用して、より良い情報を取得できます。何かのようなもの:

 WITH daterange as (
      SELECT s::date as day FROM generate_series(?, ?, '1 day')
 )
 SELECT dr.day, sum(case when r.type = 'double' then r.qty else 0) as room_double,
        sum(case when r.type = 'triple' then r.qty else 0) as room_triple....
 );

ただし、クロス集計を使用すると、2 番目のクエリが少し簡単になることに注意してください。

于 2013-11-29T06:34:06.913 に答える