【问题标题】:Using unique records as table header使用唯一记录作为表头
【发布时间】:2014-01-25 15:38:47
【问题描述】:

我有这3张桌子

  1. 学生桌[student_id(pk), firstname, lastname]
  2. 主题表[subject_id(pk), subject_title]
  3. 成绩表[score_id(pk), score, student_id(fk), subject_id(fk)]

有没有一种方法可以让我提出一个查询,以便我可以以这种形式将它显示到一个表中:

_______________________________________
|学生姓名 |主题 1 |主题 2 |主题 3 |
-------------------------------------------------- ------------
|__学生1___|___98____|___92___|___97___|
|__学生2___|___93____|___91___|___95___|
|__学生3___|___95____|___92___|___97___|
|__学生4___|___97____|___95___|___91___|

学生姓名来自学生表
Subject 1, Subject 2, Subject 来自于 Subject 表的唯一记录
然后
成绩表中的成绩

有可能还是我的数据库架构设计不好?

这是表格记录

学生桌 |学生证 |学生姓名| | 1 |学生1 | | 2 |学生2 | 主题表 |subject_id |主题名| | 1 |主题1 | | 2 |主题2 | | 3 |主题3 | 成绩表 |等级ID |等级 |主题ID |学生ID | | 1 | 87 | 1 | 1 | | 2 | 87 | 2 | 1 | | 3 | 87 | 3 | 1 | | 4 | 87 | 1 | 2 | | 5 | 87 | 2 | 2 | | 6 | 87 | 3 | 2 |

【问题讨论】:

  • 您能否提供会导致该特定输出的输入数据?
  • 你是说每张表的记录吗?
  • 你的餐桌设计不错。您要查找的结果称为PIVOT。通常由报告层负责,但在 SQL 中很有可能。 - 或者,可以使用多个 JOIN 创建它。
  • @JLineses 。 . .是的,我就是这个意思。
  • 嗨,@MarkD 你能给我一些指导吗?我对 sql 查询很陌生。

标签: sql database ms-access


【解决方案1】:

通用的 SQL 方法是使用条件聚合:

select s.studentName,
       max(case when s.subjectName = 'subject1' then g.grade end) as Subject1,
       max(case when s.subjectName = 'subject2' then g.grade end) as Subject2,
       max(case when s.subjectName = 'subject3' then g.grade end) as Subject3
from (students s join
      grades g
      on s.student_id = g.student_id
     ) join
     subjects su
     on g.subject_id = su.subject_id
group by s.studentid, s.studentName;

一些数据库也支持pivot 语法来执行此操作。

编辑:

访问查询是:

select s.studentName,
       max(iif(s.subjectName = 'subject1', grade,  NULL)) as Subject1,
       max(iif(s.subjectName = 'subject2', grade,  NULL)) as Subject2,
       max(iif(s.subjectName = 'subject3', grade,  NULL)) as Subject3
from students s inner join
     grades g
     on s.student_id = g.student_id inner join
     subjects su
     on g.subject_id = su.subject_id
group by s.studentid, s.studentName;

【讨论】:

  • 我忘了提到我使用的是 MS Access。我已经从您的答案中更改了一些陈述以使其正常工作。谢谢。以下是我所做的更改: 1. 使用 IIF 代替 case 语句 2. 将 FROM 子句中的表连接括在括号中。
  • @JLineses 。 . .在问题中提及数据库引擎很重要。我用 Access 版本更新了答案。
【解决方案2】:

假设你只会有 3 个科目,这是最简单的方法。

;WITH Student(student_id, student_name) AS
(
    SELECT 1, 'student1'    UNION ALL 
    SELECT 2, 'student2' 
)
,[Subject] (subject_id, subject_name) AS
(
    SELECT 1, 'subject1' UNION ALL
    SELECT 2, 'subject2' UNION ALL
    SELECT 3, 'subject3'
)
,Grade (grade_id, grade, subject_id, student_id) AS
(
    SELECT 1, 87, 1, 1 UNION ALL
    SELECT 2, 87, 2, 1 UNION ALL
    SELECT 3, 87, 3, 1 UNION ALL
    SELECT 4, 87, 1, 2 UNION ALL
    SELECT 5, 87, 2, 2 UNION ALL
    SELECT 6, 87, 3, 2 
)
SELECT   S.student_name
        ,Subject1   = G1.grade
        ,Subject2   = G2.grade
        ,Subject3   = G3.grade
FROM Student    S
JOIN Grade      G1  ON S.student_id = G1.student_id AND G1.subject_id = 1
JOIN Grade      G2  ON S.student_id = G2.student_id AND G2.subject_id = 2
JOIN Grade      G3  ON S.student_id = G3.student_id AND G3.subject_id = 3

PIVOT 方法;

;WITH Student(student_id, student_name) AS
(
    SELECT 1, 'student1'    UNION ALL 
    SELECT 2, 'student2' 
)
,[Subject] (subject_id, subject_name) AS
(
    SELECT 1, 'subject1' UNION ALL
    SELECT 2, 'subject2' UNION ALL
    SELECT 3, 'subject3'
)
,Grade (grade_id, grade, subject_id, student_id) AS
(
    SELECT 1, 87, 1, 1 UNION ALL
    SELECT 2, 87, 2, 1 UNION ALL
    SELECT 3, 87, 3, 1 UNION ALL
    SELECT 4, 87, 1, 2 UNION ALL
    SELECT 5, 87, 2, 2 UNION ALL
    SELECT 6, 87, 3, 2 
)
,PrePivot AS 
(
    SELECT   S.student_name
            ,ST.subject_name
            ,G.Grade
    FROM Student    S
    JOIN Grade      G   ON S.student_id = G.student_id
    JOIN [Subject]  ST  ON G.subject_id = ST.subject_id
)
SELECT *
FROM PrePivot
PIVOT
(
    MAX(Grade)
    FOR subject_name IN (subject1, subject2, subject3)
)PVT

【讨论】:

    猜你喜欢
    • 2020-05-10
    • 2010-09-19
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 2019-07-06
    • 2021-12-10
    • 2020-03-17
    相关资源
    最近更新 更多