日期:2014-05-17  浏览次数:20470 次

【急需!谢谢】成绩表 输出的每位学生对应的成绩 XML 格式

已知:

成绩表
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