我有一个简单的问题,在网上很难找到。也许我正在搜索不正确的关键词,所以我想停下来问你们,因为你们的网站对我的学习很有帮助。见下面的情景:
从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
我认为必须在左连接中完成,这样才不会改变对学生执行的实际计数。谢谢!
答案 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
在MySQL和SQLite中,您可以使用GROUP_CONCAT函数:
SELECT Student,
COUNT(*) AS Total,
GROUP_CONCAT(BookID) AS Books
FROM myStudies
GROUP BY Student
在Postgresql中,您可以使用ARRAY_AGG功能:
SELECT Student,
COUNT(*) AS Total,
ARRAY_AGG(BookID) AS Books
FROM myStudies
GROUP BY Student
在oracle中,您可以使用LISTAGG函数
SELECT Student,
COUNT(*) AS Total,
LISTAGG(BookID, ', ') WITHIN GROUP (ORDER BY BookID) AS Books
FROM myStudies
GROUP BY Student