将此SQL解释为英语

时间:2018-03-23 21:17:59

标签: sql postgresql

我被赋予了重写此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

3 个答案:

答案 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_dateend_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_employeesappointments_2015。语法:

WITH current_employees AS ( .... ),
     appointments_2015 AS ( .... )  

最后一个SELECT语句生成结果数据集:2015年12月31日或之前开始并且仍然在工作的每位员工2015年的工资总额(当前员工)。