根据四列获取一行数据来显示数据

问题描述 投票:0回答:1

我正在使用带有 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 期
哈利 科学 音乐 法语
哈利 数学
格雷格 历史 英语 地理
格雷格 哲学 公民

如果一个时段有多门课程,则可以重复,其他时段为空,否则应在同一行。

sql sql-server t-sql join union
1个回答
0
投票
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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.