我被赋予了重写此SQL的某些部分的任务,但是在完全解释它时遇到了麻烦。用简单的英语,SQL大师可以解释从“appointmentments_2015 AS”到最后的情况。
CREATE TABLE appointment (
emp_id integer NOT NULL,
jobtitle varchar(128) NOT NULL,
salary decimal(10,2) NOT NULL,
start_date date NOT NULL,
end_date date NULL
);
ALTER TABLE appointment ADD CONSTRAINT pkey_appointment PRIMARY KEY
(emp_id, jobtitle, start_date);
ALTER TABLE appointment ADD CONSTRAINT chk_appointment_period CHECK
(start_date <= end_date);
WITH current_employees AS (
SELECT DISTINCT emp_id
FROM appointment
WHERE end_date IS NULL
),
appointments_2015 AS (
SELECT a.emp_id, salary,
CASE WHEN start_date < ’2015-01-01’ THEN ’2015-01-01’ ELSE start_date END
AS start_date,
CASE WHEN end_date < ’2016-01-01’ THEN end_date ELSE ’2015-12-31’ END AS
end_date
FROM appointment a
JOIN current_employees ce ON a.emp_id = ce.emp_id
WHERE start_date < ’2016-01-01’ AND (end_date >= ’2015-01-01’ OR end_date
IS NULL)
)
SELECT
emp_id,
SUM( salary * (end_date - start_date + 1) / 365 ) AS total
FROM appointments_2015
GROUP BY emp_id
答案 0 :(得分:0)
该代码正在做的主要是使用别名约会_2015创建临时表。该临时表将包含AS()部分内的查询结果。
下面的SELECT语句是从约会_2015临时表中提取的。
可以在此处找到文档:WITH queries Docs
CASE WHEN就像一个IF声明。情况x然后,因为Z END等于IF x THEN和ELSE z
答案 1 :(得分:0)
appointments_2015 AS ( more sql )
您正在创建一个&#34;虚拟表&#34;来自括号内的查询。
在您选择start_date
和end_date
时,条件是:&#34;如果它超过2015-01-01
,请将其设置为2015-01-01
,否则请使用原始价值。然后您加入了另一个名为"current_employees"
的表格,其中start_date
位于2016-01-01
之前且end_date
大于或等于2015-01-01
,或者没有价值。
当&#34;虚拟表&#34;已创建您查询它并选择emp_id
和薪水的总和
答案 2 :(得分:0)
创建了两个临时表:current_employees
和appointments_2015
。语法:
WITH current_employees AS ( .... ),
appointments_2015 AS ( .... )
最后一个SELECT
语句生成结果数据集:2015年12月31日或之前开始并且仍然在工作的每位员工2015年的工资总额(当前员工)。