我正在使用带有 where 条件的联接从三个表中进行选择查询。除此之外,我还使用了 case 表达式。
select Staff
, case when Schedule = 1 then course end as period 1
, case when Schedule = 2 then course end as period 2
, case when Schedule = 3 then course end as period 3
from table 1
join
table 2
on condition...
join table 3
on condition
where so and so....
group by ...
员工姓名 | 第 1 期 | 第 2 期 | 第 3 期 |
---|---|---|---|
哈利 | 空 | 空 | 空 |
哈利 | 空 | 音乐 | 空 |
哈利 | 空 | 数学 | 空 |
哈利 | 科学 | 空 | 空 |
哈利 | 空 | 空 | 法语 |
格雷格 | 空 | 空 | 空 |
格雷格 | 空 | 英语 | 空 |
格雷格 | 历史 | 空 | 空 |
格雷格 | 空 | 空 | 地理 |
格雷格 | 空 | 公民 | 空 |
格雷格 | 哲学 | 空 | 空 |
我正在尝试删除第 1 期、第 2 期、第 3 期中的 Null。我还尝试通过联合将每个查询分成三个选择查询,每个查询中各有一个语句。
我也尝试过交叉连接,但它显示了 10,000 个条目。我想要这样的东西。
员工姓名 | 第 1 期 | 第 2 期 | 第 3 期 |
---|---|---|---|
哈利 | 科学 | 音乐 | 法语 |
哈利 | 空 | 数学 | 空 |
格雷格 | 历史 | 英语 | 地理 |
格雷格 | 哲学 | 公民 | 空 |
如果一个时段有多门课程,则可以重复,其他时段为空,否则应在同一行。
CREATE TABLE source (
staff VARCHAR(32),
schedule INT,
course CHAR(1)
)
INSERT INTO
source
VALUES
('Harry', 0, NULL),
('Harry', 2, 'A'),
('Harry', 2, 'B'),
('Harry', 1, 'C'),
('Harry', 3, 'D'),
('Greg', 0, NULL),
('Greg', 2, 'E'),
('Greg', 1, 'F'),
('Greg', 3, 'G'),
('Greg', 2, 'H'),
('Greg', 1, 'I')
WITH
ranked AS
(
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY staff, schedule
ORDER BY course
)
AS rank
FROM
source
)
SELECT
staff,
MAX(CASE WHEN schedule = 1 THEN course END) AS period_1,
MAX(CASE WHEN schedule = 2 THEN course END) AS period_2,
MAX(CASE WHEN schedule = 3 THEN course END) AS period_3
FROM
ranked
GROUP BY
staff,
rank
ORDER BY
staff,
rank
工作人员 | period_1 | period_2 | period_3 |
---|---|---|---|
格雷格 | F | E | G |
格雷格 | 我 | H | 空 |
哈利 | C | A | D |
哈利 | 空 | B | 空 |