Sql 分组数据问题

Sql 分组数据问题,sql,group-by,Sql,Group By,我创建了虚拟表来探索SQL中的分组概念 我想把数据分组显示 学生总分 要以逗号分隔的方式显示主题 我的问题:为什么SQL不允许在groupby子句中只保留StudentID,当我们提到ID、名称时,它是允许的,。。分组依据子句中的其他列 我得到这个错误: 列“SampleData.StudentName”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中 如何在SQL输出中以逗号分隔的方式显示主题 这是我编写的SQL: SELECT StudentID, Stud

我创建了虚拟表来探索SQL中的分组概念

我想把数据分组显示

  • 学生总分
  • 要以逗号分隔的方式显示主题
  • 我的问题:为什么SQL不允许在
    groupby
    子句中只保留
    StudentID
    ,当我们提到ID、名称时,它是允许的,。。
    分组依据
    子句中的其他列

    我得到这个错误:

    列“SampleData.StudentName”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中

    如何在SQL输出中以逗号分隔的方式显示主题

    这是我编写的SQL:

    SELECT
        StudentID, 
        StudentName,
        Standard,
        Subject,
        SUM(MarksObtained) 
    FROM
        SampleData
    GROUP BY
        StudentID, StudentName 
        --,Standard 
        --,Subject 
    ORDER BY 
        StudentID
    
    供参考的样本表:

    StudentID StudentName Standard Subject MarksObtained 
    -----------------------------------------------------
    1         A           VI       Maths              59   
    3         C           VII      English            62   
    2         B           IX       Maths              75   
    2         B           IX       English            81   
    1         A           VI       Science            47   
    1         A           VI       History            61   
    
    预期产出:

    StudentID StudentName Standard Subject                MarksObtained 
    -------------------------------------------------------------------
    1         A           VI       Maths,Science,History  167   
    3         C           VII      English                62   
    2         B           IX       Maths,English          156   
    

    一个很好的做法是将
    SELECT
    ed的所有非聚集字段明确地放在
    groupby
    子句中。一些RDBMS对其要求严格(例如Oracle),其他RDBMS可能不严格(例如sql模式下的MySQL
    ONLY\u FULL\u GROUP\u BY
    禁用)

    要在单个字段中连接
    主题
    ,需要一个聚合函数。并非所有的关系数据库都有相同的标准。他们通常接受按订购的
    选项

    使用SQL Server 2017或更高版本:
    STR_AGG

    SELECT
         StudentID 
        ,StudentName 
        ,Standard 
        ,STR_AGG(Subject, ',') WITHIN GROUP ( ORDER BY StudentID)
        ,SUM(MarksObtained) 
    FROM
        SampleData
    GROUP BY
         StudentID 
        ,StudentName 
        ,Standard 
    ORDER BY 
        StudentID
    
    SELECT
         StudentID 
        ,StudentName 
        ,Standard 
        ,LISTAGG(Subject, ',') WITHIN GROUP ( ORDER BY StudentID)
        ,SUM(MarksObtained) 
    FROM
        SampleData
    GROUP BY
         StudentID 
        ,StudentName 
        ,Standard 
    ORDER BY 
        StudentID
    
    使用MySQL:
    GROUP\u CONCAT

    SELECT
         StudentID 
        ,StudentName 
        ,Standard 
        ,GROUP_CONCAT(Subject ORDER BY StudentID SEPARATOR ', ')
        ,SUM(MarksObtained) 
    FROM
        SampleData
    GROUP BY
         StudentID 
        ,StudentName 
        ,Standard 
    ORDER BY 
        StudentID
    
    使用Oracle 11g或更高版本:
    listag

    SELECT
         StudentID 
        ,StudentName 
        ,Standard 
        ,STR_AGG(Subject, ',') WITHIN GROUP ( ORDER BY StudentID)
        ,SUM(MarksObtained) 
    FROM
        SampleData
    GROUP BY
         StudentID 
        ,StudentName 
        ,Standard 
    ORDER BY 
        StudentID
    
    SELECT
         StudentID 
        ,StudentName 
        ,Standard 
        ,LISTAGG(Subject, ',') WITHIN GROUP ( ORDER BY StudentID)
        ,SUM(MarksObtained) 
    FROM
        SampleData
    GROUP BY
         StudentID 
        ,StudentName 
        ,Standard 
    ORDER BY 
        StudentID
    
    关于你的第一个问题:

    当您发出聚合(如sum、count、max、min、avg)时,您需要对其他非聚合列进行分组。聚合是针对分组列进行的

    在英语中,你的疑问意味着

    获取从样本数据中获得的有关StudentID、StudentName、Standard、Subject的标记总和

    关于第二个问题:

    我们需要知道您正在使用哪个DBMS。每个DBMS系统都有自己的方法

    • Oracle有
      listag(列“,”)
    • MySQL有
      GROUP_CONCAT(列“,”)
    • SQL Server有
      STR_AGG(列“,”)
    • PostgreSQL具有
      string_agg(列,,)

    您正在使用哪些数据库管理系统?SQL Server。但是,我需要通用查询,它将在所有服务器上工作。对于字符串concat,您不能使用通用查询。请检查我的答案,了解更多信息。现在清楚了。如果有任何与此相关的查询,将再次发布。任何想法,如何在SQL Server 2012中实现这一点?感谢@GMB提供这些信息。公平地说,如果SQL模式包括
    仅包含
    ,MySQL在默认情况下从MySQL 5.7.5(2014-09-25)起启用,MySQL对分组规则并不松懈。因此,无论DBMS是否允许,在GROUP BY子句中包含所有未加标记的字段始终是一种良好的做法。@BillKarwin:是的,您是对的,MySQL从那时起就不那么松散了,我更新了我的答案以提及它。@AnujThite:是的,没错。谢谢大家。我将在进行SQL开发时将此作为经验法则。。