如何显示来自两个常见 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
我在显示来自两个常见 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