【问题标题】:Populate Date Dimension Table and Determine Day Type via PL/SQL通过 PL/SQL 填充日期维度表并确定日期类型
【发布时间】:2018-02-20 16:07:25
【问题描述】:

我有以下 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);

我需要用SALES 表中的每个saleDate 填充TIMES 表的saleDay 列。此外,dayType 列应根据每个saleDay 完成。 dayType 列的值应该是 Weekday、Weekend 或 Holiday,如果 dayType 是 Holiday,则它应该优于 Weekend 或 Weekday。

要获得成为Holiday 的资格,日期必须是: 1月1日, 1月15日, 1月19日, 5月28日, 7月4日, 10月8日, 11月11日, 11月22日, 12 月 25 日。

有人要求我通过 PL/SQL 填充 saleDay 和 dayType 值,但我不知道从哪里开始或如何完成。非常感谢有关如何完成此操作的任何帮助/指导。

【问题讨论】:

    标签: plsql populate dimension star-schema


    【解决方案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_TERRITORY 是AMERICAN,则星期日是一周的第一天,而在其他一些地区(例如欧洲国家/地区)则是第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中使用,可以在过程中执行查询。

    【讨论】:

    • 呃 - 这么简单的事情!我只是很难将一个想法写在纸上并将其付诸实施。很好的例子,非常感谢!
    • 应该以 PL/SQL 实现的任何特定方式?我在这里尝试了创建或替换过程:sqlfiddle.com/#!4/a0e5e/13,虽然它执行没有错误,但它似乎没有填充我的表。
    • @StevenC 据我了解,您执行了脚本,该脚本创建了一个过程。但在那之后你必须自己执行程序,比如begin insertTIMES; commit; end; /。我执行了这个并且现在填充了表格:sqlfiddle.com/#!4/8ebc8/14 所以你的过程是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多