1

このテーブルを作成する必要があります (実際にはドーナツ用ではありません)。

私は基本的に、特定の時間枠内で製品を販売する時間を出力したいと考えています。

時間枠はテーブルで定義されており、クエリを壊さずに再構成 (削除して再作成) できる必要があります。

つまり、監視対象の time_frames は、設計上、頻繁に変更されます。今日は 4 つの時間枠 (各 6h) が定義されている可能性があり、明日は 1 つだけ (24h) を作成し、翌日には 12 行 (各 2 回) が定義される可能性があります。time_frames の長さも異なる場合があります。列は同じままです。

SQLフィドル

CREATE TABLE time_frame 
  (
    id SERIAL NOT NULL
    ,start_time time
    ,end_time time
    ,PRIMARY KEY(id)
  );

CREATE TABLE donut_sales 
  (
    saleid SERIAL NOT NULL
    ,donutid INT
    ,donutname TEXT
    ,stocked timestamp
    ,sold timestamp
    ,PRIMARY KEY (saleid)
  );

--  SELECT * FROM FANCY_PIVOT_TABLE_I_DONT_UNDERSTAND
--  +---------+-------------+----------------+----------------+----------------+
--  | donutid | donutname   |  time_frame_1  |  time_frame_2  |  time_frame_3  |
--  +---------+-------------+----------------+----------------+----------------+
--  |       1 | sprinkles   |      00:17:66  |      00:17:66  |      00:17:66  |
--  |       2 | jelly       |      00:17:66  |      00:17:66  |      00:17:66  |
--  |       3 | custard     |      00:17:66  |      00:17:66  |      00:17:66  |
--  +---------+-------------+----------------+----------------+----------------+
4

1 に答える 1

1

出力テーブルに時間値がどのように表示されるかは実際にはわかりませんが、各 time_frame で販売されたドーナツの数をカウントしたい場合は、次のクエリを使用できます。

select
    ds.donutid, ds.donutname,
    sum(case when ts.id = 1 then 1 else 0 end) as time_frame_1,
    sum(case when ts.id = 2 then 2 else 0 end) as time_frame_2,
    sum(case when ts.id = 3 then 3 else 0 end) as time_frame_3,
    sum(case when ts.id = 4 then 4 else 0 end) as time_frame_4
from donut_sales as ds
    inner join time_frame as ts on
        ts.start_time <= ds.sold::time and ts.end_time > ds.sold::time
group by ds.donutid, ds.donutname
order by ds.donutid

sql fiddle demo

ただし、PostgreSQL では出力に動的な列を作成できないため、time_frames の動的な数を作成することはできません。

于 2013-08-31T10:21:58.693 に答える