1

我有一个非常简单的问题,在网上很难找到。也许我正在搜索不正确的关键字,所以我想停下来问问你们,因为你们的网站对我的学习很有帮助。看下面的场景:

从 mystudies 中选择 student,count(*) 作为 Total,(未知变量:book1、book2、book3、book4 等...)。

基本上,我想做的就是列出与总数匹配的唯一学生 ID 的所有书籍。有人可以为我指出正确的方向,读好书或其他任何东西,这样我就可以朝着正确的方向迈出一步吗?我假设它将通过左连接完成(不确定如何执行 x1、x2、x3 部分),然后只需通过唯一的学生 ID 号(无重复)将两者链接起来,但在线上的每个人都指向枢轴但出现枢轴将所有行放入列而不是一列。SQL server 2005 是首选平台。

谢谢!

对不起

以下查询为表中所有重复条目生成我的唯一 ID(学生)和学生计数:

select student, count(*) as Total 
from mystudies
group by student order by total desc

我不知道的部分是如何在表唯一 id (boookid) 上创建左连接

select mystudies1.student, mystudies1.total, mystudies2.bookid 
from  (  select student, count(*) as Total 
         from mystudies
         group by student
      ) mystudies1
      left join 
      (  select student, bookid 
         from mystudies
      ) mystudies2 
         on mystudies1.student=mystudies2.student
order by mystudies1.total desc, mystudies1.student asc

显然,上面的行将产生类似于以下的结果:

Student    Total  BookID
000001    3        100001
000001    3        100002
000001    3        100003
000002    2        200001
000002    2        200002
000003    1        300001

但我真正想要的是类似于以下内容:

Student    Total  BookID
000001     3      100001, 100002, 100003
000002     2      200001, 200002
000003     1      300001

我认为它必须在左连接中完成,这样它就不会改变对学生执行的实际计数。谢谢!

4

1 回答 1

3

在 SQL-Server 中使用 FOR XML 路径方法:

SELECT  Student,
        Total,
        STUFF(( SELECT  ', ' + BookID
                FROM    MyStudies books
                WHERE   Books.Student = MyStudies.Student
                FOR XML PATH(''), TYPE
                ).value('.', 'VARCHAR(MAX)'), 1, 2, '') AS Books
FROM    (   SELECT  Student, COUNT(*) AS Total
            FROM    myStudies
            GROUP BY Student
        ) MyStudies

我之前已经完整解释了 XML PATH 方法是如何工作随着对我的回答的进一步改进,这里指出

SQL Server 小提琴


在 MySQL AND SQLite 中,您可以使用GROUP_CONCAT函数:

SELECT  Student, 
        COUNT(*) AS Total, 
        GROUP_CONCAT(BookID) AS Books
FROM    myStudies
GROUP BY Student

MySQL 小提琴

SQLite 小提琴


在 Postgresql 中,您可以使用ARRAY_AGG函数:

SELECT  Student, 
        COUNT(*) AS Total, 
        ARRAY_AGG(BookID) AS Books
FROM    myStudies
GROUP BY Student

Postgresql 小提琴


在 oracle 中,您可以使用LISTAGG函数

SELECT  Student, 
        COUNT(*) AS Total, 
        LISTAGG(BookID, ', ') WITHIN GROUP (ORDER BY BookID) AS Books
FROM    myStudies
GROUP BY Student

Oracle SQL 小提琴


于 2012-05-29T09:34:04.357 回答