Sql 如何将一列的结果合并到另一列

Sql 如何将一列的结果合并到另一列,sql,sql-server,Sql,Sql Server,我正试图创建一个学生数据库,但我坚持了给定的要求 我被要求创建两个表格,一个是学生注册号、受试者总数,另一个是学生姓名、总数、排名。我可以理解,这里我们需要单独使用学生的名字,稍后再合并,但让我在学生科目中留下印象的部分可能会有所不同,这意味着如果1号学生有3个科目,那么2号学生可能有2个科目,3号学生可能有5个科目,根据这一点,我们必须排列顺序 CREATE TABLE Student (StudentID int, StudentName varchar(6), Details varcha

我正试图创建一个学生数据库,但我坚持了给定的要求

我被要求创建两个表格,一个是学生注册号、受试者总数,另一个是学生姓名、总数、排名。我可以理解,这里我们需要单独使用学生的名字,稍后再合并,但让我在学生科目中留下印象的部分可能会有所不同,这意味着如果1号学生有3个科目,那么2号学生可能有2个科目,3号学生可能有5个科目,根据这一点,我们必须排列顺序

CREATE TABLE Student
(StudentID int, StudentName varchar(6), Details varchar(1));    


INSERT INTO Student
(StudentID, StudentName, Details)
  VALUES
(1, 'John', 'X'),
(2, 'Paul', 'X'),
(3, 'George', 'X'),
(4, 'Paul', 'X');

CREATE TABLE Subject
(SubjectID varchar(1), SubjectName varchar(7));    

INSERT INTO Subject
  (SubjectID, SubjectName)
VALUES
('M', 'Math'),
('E', 'English'),
('H', 'History');

CREATE TABLE Mark
(StudentID int, SubjectID varchar(1), MarkRate int);    

INSERT INTO Mark
 (StudentID, SubjectID, MarkRate)
VALUES
(1, 'M', 90),
(1, 'E', 100),
(2, 'M', 95),
(2, 'E', 70),
(3, 'E', 95),
(3, 'H', 98),
(4, 'H', 90),
(4, 'E', 100);
我需要2个输出 第一个是

ID  |subjects |marks
----------------------------------------------------------
1     maths     98
1     science   87
1     social    88
2     maths     87
2     english   99
3     maths     96
3     evs       100
3     social     88
3     history    90
第二张表是

NO  |name |total|rank
----------------------------------------------------------
1   xxx     123     1
2   yyy     456     2
3   zzz     789      3

我需要像这样输出n个条目

我知道第一个查询列出了每个学生的分数

SELECT
    m.StudentID as ID,
    s.SubjectName as subjects,
    m.MarkRate as marks
FROM 
    Mark m
    INNER JOIN Subject s on m.SubjectID = m.SubjectID 
ORDER BY 
    m.StudentID,
    s.SubjectName
第二个查询给出了学生的总分及其排名

SELECT 
    X.StudentID,
    X.StudentName,
    ROWNUMBER() OVER ( ORDER BY X.TotalMark desc) as Rank
FROM (
    SELECT 
        m.StudentID,
        s.StudentName,
        sum(m.MarkRate) TotalMark
    FROM 
        Mark m
        INNER JOIN Student s on s.StudentID = m.StudentID 
    GROUP BY 
        m.StudentID,
        s.StudentName
) X
ORDER BY X.TotalMark desc
输出

StudentID   SubjectName MarkRate
1              Math       90
1              English    100
2              Math       95
2              English    70
3              English    95
3              History    98
4              History    90
4              English    100
StudentID   StudentName MarkRate    rn
3             George    193         1
4             Paul      190         2
1             John      190         2
2             Paul      165         4
第二个问题

  with cte as
    (
    select a.StudentID,StudentName,sum(MarkRate)MarkRate  from #Student a join #Mark B on a.StudentID=b.StudentID
    group by a.StudentID,StudentName
    )
    select *,rank() over( order by MarkRate desc) as rn  from cte
输出

StudentID   SubjectName MarkRate
1              Math       90
1              English    100
2              Math       95
2              English    70
3              English    95
3              History    98
4              History    90
4              English    100
StudentID   StudentName MarkRate    rn
3             George    193         1
4             Paul      190         2
1             John      190         2
2             Paul      165         4

要获取主题名称的标记列表,只需执行以下操作: 您需要使用
JOIN

SELECT M.StudentId
        ,SU.SubjectName
        ,M.MarkRate
FROM Mark M
INNER JOIN  Subject SU ON M.SubjectID = SU.SubjectID
要获得排名的总分,您需要使用
GROUP BY
RANK()
函数:

SELECT M.StudentId
        ,ST.StudentName
        ,SUM(MarkRate) Total
        ,RANK() OVER(ORDER BY SUM(MarkRate) ) Rank
        --,RANK() OVER(ORDER BY SUM(MarkRate) DESC) Rank
FROM Mark M
INNER JOIN  Student ST ON M.StudentId = ST.StudentId
GROUP BY M.StudentId
        ,ST.StudentName

您可以对这两个输出尝试以下查询

SELECT
    Student.StudentID as ID,
    [Subject].SubjectName as subjects,
    Mark.MarkRate as marks
FROM 
    Student
    INNER JOIN Mark on Student.StudentID = Mark.StudentID
    INNER JOIN [Subject] on [Subject].SubjectID = Mark.SubjectID 
ORDER BY 
    Student.StudentID,
    SubjectName
下面是第二次输出的查询。正如您所说,对于分数较低的人,可以获得排名1,否则您可以在下面的查询中按总描述排序,以获得较高的分数排名1

SELECT ID, StudentName, Total, Row_number() Over (Order BY Total) Ranks FROM(
SELECT Id, StudentName, SUM(marks) as Total FROM (
SELECT
    Student.StudentID as ID,
    [Subject].SubjectName as subjects,
    Mark.MarkRate as marks,
    Student.StudentName
FROM 
    Student
    INNER JOIN Mark on Student.StudentID = Mark.StudentID
    INNER JOIN [Subject] on [Subject].SubjectID = Mark.SubjectID 
)Tot
Group By Id, StudentName
)Ranks

“不参加”是什么意思?@joakim Danielson这是一个错误,先生,我将删除它。为什么得分最高的学生排在最后?@salman,不管科目如何,学生的总数都被视为排名sir@Jojofever请在发布代码片段时检查答案,您的答案应该包含对您的解决方案的解释。@fariraishe shubam它工作正常,我还有另一个疑问,我们可以使用更新关键字吗it@fariraisheShumba我需要动态更新加法函数,当我添加新值时,比如insert intoit中的值正常工作,另外,我还有一个疑问,我们是否可以在itit中使用更新关键字?IT是否正常工作?我还有一个疑问,我们是否可以在itit中使用更新关键字?IT是否正常工作,另外,我还有一个疑问,我们是否可以使用更新关键字it@Jojofever您想更新什么?我需要使用关键字UPDATE来更新我输入的每个实体的总分数(我的任务是在其中使用关键字UPDATE)