SQL Server - 可能的Pivot解决方案?

时间:2012-05-28 22:54:15

标签: sql pivot

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

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

基本上我想要做的就是列出所有书籍,以获得与总计数相匹配的唯一学生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

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

1 个答案:

答案 0 :(得分: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方法的工作原理here。我的答案进一步改进,指出here

SQL Server Fiddle


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

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

MySQL Fiddle

SQLite Fiddle


在Postgresql中,您可以使用ARRAY_AGG功能:

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

Postgresql Fiddle


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

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

Oracle SQL Fiddle