问题描述
|
我不知道每个人将拥有多少门课程,或者由于可能的数量,课程的名称是什么,所以我不能使用普通的子选择或案例。
我有一张这样的桌子:
ID NAME CLASS
----------------------
1 BOB Course1
1 BOB Course2
1 BOB Course3
2 JOHN Course1
2 JOHN Course2
3 SAM Course1
4 BILL Course2
4 BILL Course3
我想使它看起来像这样,最后一列是针对拥有最多类的人的:
ID NAME CLASS CLASS2 CLASS3 CLASS4..........
------------------------------------------------------
1 BOB Course1 Course2 Course3 NULL............
2 JOHN Course1 Course2 NULL NULL............
3 SAM Course1 NULL NULL NULL............
4 BILL Course2 Couse3 NULL NULL............
我最好的主意是继续获取最大CLASS并删除它,直到用完记录为止。
编辑:澄清:我的列标题将不是实际的课程,而只是一种编号老师分配给多少课程的方法。
解决方法
安倍的建议如下:
select * from Class
pivot (COUNT(ID) for CLASS in ([Course1],[Course2],[Course3])) as Taking
结果如下:
Name Course1 Course2 Course3
BILL 0 1 1
BOB 1 1 0
JOHN 1 1 0
SAM 1 0 0
当然,这与您想要的略有不同。您希望课程1具有“第一课程”的值。唯一的方法是使用动态SQL。
如果要用逗号分隔的课程列表(在一列中),则可以更轻松,更快速地生成课程。
逗号列表
select c.Name,STUFF((SELECT ( \',\' + c2.Class )
FROM #Class c2
WHERE c.Name = c2.Name
ORDER BY c2.Class
FOR XML PATH( \'\' )),1,2,\'\') as [Class List]
FROM #Class c
GROUP BY c.Name
给你:
Name Class List
BILL Course2,Course3
BOB Course1,Course2,Course3
JOHN Course1,Course2
SAM Course1
,您可以看看使用PIVOT
在此处了解更多信息:
http://msdn.microsoft.com/en-us/library/ms177410.aspx
我相信您可以在ID上使用MAX作为汇总函数。