2013-08-30 4 views
1

이 테이블을 만들 필요가 있습니다 (실제로 도넛 용은 아닙니다).Postgres 동적 피벗 테이블

기본적으로 특정 시간 내에 제품을 판매 할 시간을 출력하고 싶습니다.

시간 프레임은 테이블에 정의되어 있으므로 쿼리를 중단하지 않고도 재구성 (삭제 및 재 작성) 할 수 있어야합니다.

즉, 모니터링에 관심이있는 time_frames는 의도적으로 자주 변경됩니다. 오늘날에는 4 개의 시간대 (6 시간)가 정의 될 수 있으며 내일에는 단 하나 (24 시간), 다음 날에는 12 행 (2 EA)이 될 수 있습니다. time_frames는 길이가 다를 수 있습니다. 열은 동일하게 유지됩니다.

SQLFiddle

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 | 
-- +---------+-------------+----------------+----------------+----------------+ 
+0

"모니터링에 관심이있는 time_frames는 의도적으로 자주 변경됩니다." 당신은 새로운 time_frames 행이 추가되거나 테이블 구조가 변경된다는 것을 의미합니다. "시간 프레임은 테이블에 정의되어 있으며 쿼리를 중단하지 않고 재구성 (삭제 및 재 작성) 할 수 있어야합니다." 같은 구조? –

+0

구조는 동일하게 유지되지만 모든 새 값으로 행을 삭제하고 다시 만들 수 있습니다. 오늘 4 열이 있고 내일은 12가 될 수 있습니다. – gooddadmike

답변

1

실제로 시간 값이 출력 테이블에 표시되는 방식을 이해하지 않지만, 각 time_frame에서 판매 도넛의 수를 계산하려면,이 쿼리를 사용할 수 있습니다

을 당신이 Postg에 출력 동적 열을 만들 수 없기 때문에
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

당신은,하지만 time_frames의 동적 수를 할 수 없습니다 reSQL.

+0

나는 동적 인 출력을 특별히 찾고있었습니다. MSSQL에서 이와 같이 http://stackoverflow.com/questions/11404062/sql-server-advanced-report-of-multiple-rows-into-one – gooddadmike