我有以下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
列的值应为Weekday
,Weekend
或Holiday
,如果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填充Holiday
和saleDay
值,但我不知道从哪里开始或如何实现此目的。任何有关如何完成此任务的帮助/指导非常感谢。
答案 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_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中使用它,可以在过程中执行查询。