如何显示来自两个常见 table 表达式的列?

How do I display columns from two common table expression?

我在显示来自两个常见 table 表达式的列时遇到问题。我通过查询学生姓名和他们的期中成绩创建了第一个 table,另一个 table 学生姓名和他们的期末成绩。

  CREATE TABLE MidTerm AS (SELECT Name, Score
                           FROM GRADE
                           WHERE TYPE = ''MidTerm
  )
  CREATE TABLE FinalTerm AS (SELECT Name, Score
                           FROM GRADE
                           WHERE TYPE = 'Final'
  )

创建的两个具有相同的列数和相同的变量。现在我想显示 Name、Score "MidTerm" 和 Score "FinalTerm",我该如何实现?我设法使用 UNION 仅以 SELECT * 为代价。如果我指定

 Midterm table:

              Name : Score
               A   : 50
               B   : 60
 Finalterm table:

              Name : Score
               A   :  70
               B   :  80

我想通过显示

加入 CTE tables
     Final Intended Result:
                          Name : Score "MidTerm" : Score "FinalTerm"
                           A   : 50              : 70
                           B   : 60              : 80

它会说无效的列标识符。我该如何解决?

我认为您只是在寻找条件聚合:

select 
    name, 
    max(case when score = 'MidTerm' then score end) MidTerm,
    max(case when score = 'Final' then score end) Final
from grade
where score in ('MidTerm', 'Final')
group by name

我很困惑。使用条件聚合:

SELECT Name,
       MAX(CASE WHEN Type = 'MidTerm' THEN Score END) as midterm_score,
       MAX(CASE WHEN Type = 'Final' THEN Score END) as final_score,
FROM GRADE
GROUP BY Name;

CTE 对此查询完全没有帮助。

您可以使用 JOIN:

select m.name, m.score as midterm_score, f.score as final_score
from grade m join
     grade f
     on m.name = f.name and
        m.type = 'midterm' and
        f.type = 'final';

请注意,这仅显示 name 两个分数。

在这些 table 中添加学生 ID,并使用它来连接它们并收集您需要的列。

我不认为创建这两个 table 真的是个好主意, 但是,好吧,我不知道你计算分数的复杂程度。

无论如何,我建议您考虑为此创建一个视图,而不是创建那些 table。

如果根据 gordon 的回答中的评论,您有两个期中和期末成绩表,那么只需执行 join,您将得到如下结果:

Select m.name, 
       M.score as midterm_score,
       F.score as final_score
From midterm_table m
Join final_table f 
  on (m.name = f.name);

干杯!!

一个简单的连接就可以解决这个问题:

SELECT m.NAME AS "Name",
       m.SCORE AS "Score MidTerm",
       f.SCORE AS "Score FinalTerm"
  FROM MIDTERM m
  LEFT OUTER JOIN FINALTERM f
    ON f.NAME = m.NAME

db<>fiddle here