已知:
成绩表
Name Course Score
张三 物理 70
张三 化学 80
李四 地理 78
李四 物理 88
王五 物理 67
王五 化学 89
求:能够得出以下结果的SQL语句
结果一(输出格式):
<row name="张三">
<Name>
<Course>物理</Course>
<Score>70</Score>
<Course>化学</Course>
<Score>80</Score>
</Name>
</row>
<row name="李四">
<Name>
<Course>地理</Course>
<Score>78</Score>
<Course>物理</Course>
<Score>88</Score>
</Name>
</row>
<row name="王五">
<Name>
<Course>物理</Course>
<Score>67</Score>
<Course>化学</Course>
<Score>89</Score>
</Name>
</row>
结果二:
<row name="张三">
<Name>
<物理>70</物理>
<化学>80</化学>
</Name>
</row>
<row name="李四">
<Name>
<地理>78</地理>
<物理>88</物理>
</Name>
</row>
<row name="王五">
<Name>
<物理>67</物理>
<化学>89</化学>
</Name>
</row>
------最佳解决方案--------------------
row 属性中有name了 还要个name元素干嘛啊
结果1
DECLARE @tb TABLE(NAME VARCHAR(20),Course VARCHAR(20),Score INT)
INSERT INTO @tb
select '张三','物理', 70 union all
select '张三','化学' ,80 union all
select '李四', '地理', 78 union all
select '李四', '物理' ,88 union all
select '王五', '物理', 67 union all
select '王五', '化学', 89
DECLARE @str NVARCHAR(4000)=''
SELECT name+xmlStr+e FROM (
SELECT name='<row NAME='''+NAME+'''><Name>',xmlStr=(SELECT Course,Score FROM @tb WHERE t1.NAME=NAME FOR XML PATH('')),
e='</Name></row>'
FROM @tb t1
GROUP BY t1.NAME
) t
/*
------------------------------------------------
<row NAME='李四'><Name><Course>地理</Course><Score>78</Score><Course>物理</Course><Score>88</Score></Name></row>
<row NAME='王五'><Name><Course>物理</Course><Score>67</Score><Course>化学</Course><Score>89</Score></Name></row>
<row NAME='张三'><Name><Course>物理</Course><Score>70</Score><Course>化学</Course><Score>80</Score></Name></row>
(3 行受影响)
*/
------其他解决方案--------------------
在程序里操作xml吧,sql很难实现。
------其他解决方案--------------------
select * from @tb for xml raw