填充日期维度表并通过PL / SQL确定日期类型

时间:2018-02-19 23:15:06

标签: plsql populate dimension star-schema

我有以下SQL表:

CREATE TABLE SALES
(saleID         INT     PRIMARY KEY,
grossSalePrice      DECIMAL(9,2),
vehicleStatus       VARCHAR(10) NOT NULL CHECK (lower(vehicleStatus) IN ('available', 'sold', 'pending')),
saleDate        DATE,
saleMileage     INT,
customerID      INT,
salespersonID       INT,
vehicleVIN      VARCHAR(25),
CONSTRAINT SALES_FK1 FOREIGN KEY (customerID) REFERENCES CUSTOMERS(customerID),
CONSTRAINT SALES_FK2 FOREIGN KEY (vehicleVIN) REFERENCES VEHICLES(vehicleVIN),
CONSTRAINT SALES_FK3 FOREIGN KEY (salespersonID) REFERENCES SALESPERSONS(salespersonID));

我已经创建了以下Star-Schema维度表:

CREATE TABLE TIMES
(saleDay        DATE        PRIMARY KEY,
dayType         VARCHAR(50) NOT NULL);

我需要在saleDay表格中的每个TIMES填充saleDate表格的SALES列。此外,dayType列应基于每个saleDay完成。 dayType列的值应为WeekdayWeekendHoliday,如果dayType为Holiday,则应优先Weekend或{ {1}}。

要符合成为Weekday的资格,日期必须为: 1月1日, 1月15日, 1月19日, 5月28日, 7月4日, 10月8日, 11月11日, 11月22日, 12月25日。

我已被要求通过PL / SQL填充HolidaysaleDay值,但我不知道从哪里开始或如何实现此目的。任何有关如何完成此任务的帮助/指导非常感谢。

1 个答案:

答案 0 :(得分:1)

无需使用PL / SQL。

对于假期,请使用以下内容:

select '01.01' hd from dual union all
select '15.01' from dual union all
select '19.01' from dual union all
select '28.05' from dual union all
select '04.07' from dual union all
select '08.10' from dual union all
select '11.11' from dual union all
select '22.11' from dual union all
select '25.12' from dual

计算周末:to_char(saleDate, 'd')。它返回一周中的一天。但请注意,这取决于NLS设置。如果设置中的NLS_TERRITORYAMERICAN,则星期日是一周的第一天,在某些其他地区(例如欧洲国家/地区),则为第7天。

所以查询是:

insert into times (saleDay, dayType)
select saleDate, case when h.hd is not null then 'Holiday'
                      when to_char(saleDate, 'd') in (1,7) then 'Weekend' -- I suppose you are American
                      else 'Weekday' end dayType
   from sales s left join 
       (<holiday query above>) h
        on h.hd = to_char(s.saleDate, 'dd.mm')

如果需要在PL / SQL中使用它,可以在过程中执行查询。

相关问题