行转列或列转行写法

1972阅读 0评论2012-09-04 hui_unix
分类:数据库开发技术


点击(此处)折叠或打开

  1. /*    
  2. 实现行转列
  3. a
  4. name    objec    score
  5. a        EN        89
  6. a        CH        78
  7. a        HO        99
  8. b        EN        34
  9. b        CH        88
  10. b        HO        66
  11. 要求输出结果为:
  12. name    EN    CH    HO
  13. a        89    78    99
  14. b        34    88    66
  15. */

  16. USE tempdb
  17. IF (SELECT 1 FROM sys.sysobjects WHERE name ='t' AND type='u') is NOT NULL
  18. DROP TABLE t


  19. CREATE TABLE t
  20. (
  21.     NAME    CHAR(10),
  22.     objec    CHAR(10),
  23.     score    FLOAT
  24. )
  25. INSERT INTO t
  26. VALUES('a','EN',89),('a','CH',78),('a','HO',99),('b','EN',34),('b','CH',88),('b','HO',66)

  27. SELECT * FROM T

  28. SELECT NAME ,MAX(CASE objec WHEN 'EN' THEN score ELSE 0 END ) EN,MAX(CASE objec WHEN 'CH' THEN score ELSE 0 END ) CH,MAX(CASE objec WHEN 'HO' THEN score ELSE 0 END ) HO
  29. FROM t
  30. GROUP BY NAME
  31. --=======================================================================================================================================================

  32. /*    
  33. 实现行转列
  34. a
  35. name    objec    score
  36. a        EN        89
  37. a        CH        78
  38. a        HO        99
  39. b        EN        34
  40. b        CH        88
  41. b        HO        66
  42. 要求输出结果为:
  43. name    objec        totalsorce
  44. a        EN,CH,HO    266
  45. b        EN,CH,HO    188
  46. */

  47. USE tempdb
  48. IF (SELECT 1 FROM sys.sysobjects WHERE name ='t' AND type='u') is NOT NULL
  49. DROP TABLE t

  50. CREATE TABLE t
  51. (
  52.     NAME    CHAR(10),
  53.     objec    CHAR(10),
  54.     score    FLOAT
  55. )
  56. INSERT INTO t
  57. VALUES('a','EN',89),('a','CH',78),('a','HO',99),('b','EN',34),('b','CH',88),('b','HO',66)

  58. SELECT * FROM T

  59. --为了去除objec中的最后一个逗号,插入一个临时表,并使用substring处理

  60. SELECT name ,(SELECT LTRIM(RTRIM(objec))+',' FROM T WHERE objec=t.objec FOR XML PATH('')) objec,SUM(temp.score) totalscroe INTO #tmp
  61. FROM T temp
  62. GROUP BY name


  63. SELECT NAME ,SUBSTRING(objec,0,LEN(objec)-1) objec ,totalscroe
  64. FROM #tmp

上一篇:数据库阻塞和死锁的区别
下一篇:微软未公开存储过程及有用的函数