`
showmystage
  • 浏览: 55182 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

数据横排

SQL 
阅读更多
sql 代码
  1. 总结一下关于行列转置的实现方法   
  2.   
  3.   
  4. 1、固定列数的行列转换   
  5. 如   
  6. student subject grade   
  7. --------- ---------- --------   
  8. student1 语文 80   
  9. student1 数学 70   
  10. student1 英语 60   
  11. student2 语文 90   
  12. student2 数学 80   
  13. student2 英语 100   
  14. ……   
  15. 转换为   
  16. 语文 数学 英语   
  17. student1 80 70 60   
  18. student2 90 80 100   
  19. ……   
  20. 语句如下:select student,    
  21. sum(decode(subject,'语文', grade,null)) "语文",   
  22. sum(decode(subject,'数学', grade,null)) "数学",   
  23. sum(decode(subject,'英语', grade,null)) "英语"  
  24. from table  
  25. group by student;   
  26.     
  27.   
  28. 2、不定列行列转换   
  29. 如   
  30. c1 c2   
  31. --- -----------   
  32. 1 我   
  33. 1 是   
  34. 1 谁   
  35. 2 知   
  36. 2 道   
  37. 3 不   
  38. ……   
  39. 转换为   
  40. 1 我是谁   
  41. 2 知道   
  42. 3 不   
  43.   
  44. 这一类型的转换可以借助于PL/SQL来完成,这里给一个例子   
  45. CREATE OR REPLACE FUNCTION get_c2(tmp_c1 NUMBER)   
  46. RETURN VARCHAR2   
  47. IS  
  48. Col_c2 VARCHAR2(4000);   
  49. BEGIN  
  50. FOR cur IN (SELECT c2 FROM t WHERE c1=tmp_c1) LOOP   
  51. Col_c2 := Col_c2||cur.c2;   
  52. END LOOP;   
  53. Col_c2 := rtrim(Col_c2,1);   
  54. RETURN Col_c2;   
  55. END;   
  56.   
  57. select distinct c1 ,get_c2(c1) cc2 from table;   
  58.   
  59.   
  60. 或者不用pl/sql,利用分析函数和 CONNECT_BY 实现:   
  61.   
  62. SELECT c1, SUBSTR (MAX (SYS_CONNECT_BY_PATH (c2, ';')), 2) NAME  
  63.     FROM (SELECT c1, c2, rn, LEAD (rn) OVER (PARTITION BY c1 ORDER BY rn) rn1   
  64.             FROM (SELECT c1, c2, ROW_NUMBER () OVER (ORDER BY c2) rn   
  65.                     FROM t))   
  66. START WITH rn1 IS NULL  
  67. CONNECT BY rn1 = PRIOR rn   
  68. GROUP BY c1;   
  69.   
  70.   
  71. 3、列数不固定(交叉表行列转置)   
  72. 这种是比较麻烦的一种,需要借助pl/sql:   
  73.   
  74. 原始数据:   
  75. CLASS1     CALLDATE         CALLCOUNT   
  76. 1          2005-08-08       40   
  77. 1          2005-08-07       6   
  78. 2          2005-08-08       77   
  79. 3          2005-08-09       33   
  80. 3          2005-08-08       9   
  81. 3          2005-08-07       21   
  82.   
  83. 转置后:   
  84. CALLDATE     CallCount1 CallCount2 CallCount3   
  85. ------------ ---------- ---------- ----------   
  86. 2005-08-09   0          0          33   
  87. 2005-08-08   40         77         9   
  88. 2005-08-07  6      0          21   
  89.   
  90. 试验如下:   
  91. 1). 建立测试表和数据   
  92. CREATE TABLE t(   
  93.     class1 VARCHAR2(2 BYTE),   
  94.     calldate DATE,   
  95.     callcount INTEGER  
  96. );   
  97.   
  98. INSERT INTO t(class1, calldate, callcount)   
  99. VALUES ('1', TO_DATE ('08/08/2005', 'MM/DD/YYYY'), 40);   
  100.   
  101. INSERT INTO t(class1, calldate, callcount)   
  102. VALUES ('1', TO_DATE ('08/07/2005', 'MM/DD/YYYY'), 6);   
  103.   
  104. INSERT INTO t(class1, calldate, callcount)   
  105. VALUES ('2', TO_DATE ('08/08/2005', 'MM/DD/YYYY'), 77);   
  106.   
  107. INSERT INTO t(class1, calldate, callcount)   
  108. VALUES ('3', TO_DATE ('08/09/2005', 'MM/DD/YYYY'), 33);   
  109.   
  110. INSERT INTO t(class1, calldate, callcount)   
  111. VALUES ('3', TO_DATE ('08/08/2005', 'MM/DD/YYYY'), 9);   
  112.   
  113. INSERT INTO t(class1, calldate, callcount)   
  114. VALUES ('3', TO_DATE ('08/07/2005', 'MM/DD/YYYY'), 21);    
  115.   
  116. COMMIT ;    
  117.   
  118. 2). 建立ref cursor准备输出结果集    
  119. CREATE OR REPLACE PACKAGE pkg_getrecord   
  120. IS  
  121.     TYPE myrctype IS REF CURSOR;   
  122. END pkg_getrecord;   
  123. /   
  124.   
  125. 3). 建立动态sql交叉表函数,输出结果集    
  126. CREATE OR REPLACE FUNCTION fn_rs   
  127.     RETURN pkg_getrecord.myrctype   
  128. IS  
  129.     s VARCHAR2 (4000);    
  130.     CURSOR c1 IS  
  131.     SELECT ',sum(case when Class1='   
  132.             || class1   
  133.             || ' then CallCount else 0 end)'   
  134.             || ' "CallCount'  
  135.             || class1  
  136.             || '"' c2   
  137.     FROM t   
  138.     GROUP BY class1;   
  139.     r1 c1%ROWTYPE;   
  140.     list_cursor pkg_getrecord.myrctype;   
  141. BEGIN  
  142.     s := 'select CallDate ';   
  143.     OPEN c1;   
  144.     LOOP   
  145.         FETCH c1 INTO r1;   
  146.         EXIT WHEN c1%NOTFOUND;   
  147.         s := s || r1.c2;   
  148.     END LOOP;   
  149.     CLOSE c1;   
  150.     s := s || ' from T group by CallDate order by CallDate desc ';   
  151.     OPEN list_cursor FOR s;   
  152.     RETURN list_cursor;   
  153. END fn_rs;   
  154. /    
  155.   
  156. 4). 测试在sql plus下执行:   
  157. var results refcursor;   
  158. exec :results := fn_rs;   
  159. print results;   
  160. CALLDATE        CallCount1 CallCount2 CallCount3   
  161. --------------- ---------- ---------- ----------   
  162. 2005-08-09      0          0          33   
  163. 2005-08-08      40         77         9   
  164. 2005-08-07      6          0          21   
分享到:
评论

相关推荐

    SQL创建存储过程[横向显示列的数据]

    SQL创建存储过程[横向显示列的数据] 在动态显示不确定列数量的数据时,有点作用

    GB2312字库(竖置横排)点阵数据

    FONT.C中存储了GB2312字库(竖置横排)点阵数据,为GT21L16S2Y字库芯片内容的缩减版

    code_R语言_纵向数据_

    采用R语言编程,解决纵向数据线性混效应模型中的参数估计、等问题

    asp 横排显示数据

    asp 横排显示数据的方法,实际上就是控制tr td来实现多行多列的实现方法,大家可以先用静态的表格然后循环输出就可以了。

    火狼首页横排N格DuceXHome 2.4 For Discuz!7.0.rar

    能方便地展示论坛最新、最热等数据,作为会员入站首要导航,帮助会员最快地参与主题。 无数据库修改,后台模块化管理,自由设置模块展现样式,扩展性强。 支持调用组图图片、远程附件图片、检索帖子外链图片。 ...

    UltraEdit中将一竖行数据转换为横行

    UltraEdit中将一竖行数据转换为横行 UltraEdit中将一竖行数据转换为横行 UltraEdit中将一竖行数据转换为横行

    字库芯片GT20L16S1Y和GT30L32S4用户数据手册规格书带地址运算版手册资料.zip

    字库芯片GT20L16S1Y和GT30L32S4用户数据手册规格书带地址运算版手册资料 GT20L16S1Y是一款内含16x16点阵的汉字库芯片,支持GB2312国标简体汉字(含有国家信标委合 法授权)、ASCII字符。排列格式为竖置横排。用户...

    火狼首页横排调用DuceXHome 2.4插件 for Discuz!7.0 BIG5.rar

    能方便地展示论坛最新、最热等数据,作为会员入站首要导航,帮助会员最快地参与主题。 无数据库修改,后台模块化管理,自由设置模块展现样式,扩展性强。 支持调用组图图片、远程附件图片、检索帖子外链图片。 ...

    火狼首页横排调用DuceXHome2.4插件 for Discuz!7.0 UTF8.rar

    能方便地展示论坛最新、最热等数据,作为会员入站首要导航,帮助会员最快地参与主题。 无数据库修改,后台模块化管理,自由设置模块展现样式,扩展性强。 支持调用组图图片、远程附件图片、检索帖子外链图片。 ...

    首页横排数据调用for discuz 7.0 GBK

    - 能方便地展示论坛最新、最热等数据,作为会员入站首要导航,帮助会员最快地参与主题。 - 无数据库修改,后台模块化管理,自由设置模块展现样式,扩展性强。 - 支持调用远程附件图片。 - 进行了多种情况的浏览器...

    首页横排数据调用 for discuz 7.0 BIG5

    - 能方便地展示论坛最新、最热等数据,作为会员入站首要导航,帮助会员最快地参与主题。 - 无数据库修改,后台模块化管理,自由设置模块展现样式,扩展性强。 - 支持调用远程附件图片。 - 进行了多种情况的浏览器...

    首页横排数据调用 for discuz 7.0 UTF8

    - 能方便地展示论坛最新、最热等数据,作为会员入站首要导航,帮助会员最快地参与主题。 - 无数据库修改,后台模块化管理,自由设置模块展现样式,扩展性强。 - 支持调用远程附件图片。 - 进行了多种情况的浏览器...

    最土团购网站首页多团横排插件 v1.0

    本插件是以最土团购程序为基础,对首页实现多团横排,分类显示,漂浮QQ,以及动态图片切换等功能的开发。1、PHP+SQL2、首页多团显示团购模板,橙色...4、上传替换即可,前台数据内容均可在后台对应栏目操作,简易明了

    GT30L32S4W_GT30L32S4W_GT30L32S4W数据手册_poetexi

    GT30L32S4W 数据手册

    横向滚动的ListView表格展示数据【案例】

    横向滚动的ListView表格展示数据【案例】

    Sql Server 2000 行转列的实现(横排)

    现有的测试数据为: 我们需要的结果是: 代码如下:DECLARE @strSQL VARCHAR(8000) SET @strSQL = ‘SELECT t.STUNAME [姓名]’ SELECT @strSQL = @strSQL + ‘,SUM(CASE s.SNAME WHEN ”’ + SNAME + ”’ THEN ...

    最土团购网站首页多团横排插件源代码

    本插件是以最土团购程序为基础,对首页实现多团横排,分类显示,漂浮QQ,以及动态图片切换等功能的开发。 1、PHP+SQL 2、首页多团显示团购模板,橙色模板,支持横排|分类|品牌... 4、上传替换即可,前台数据内容均可

    一贝问卷系统 v6.3.zip

    6.界面风格均可以后台设置,问卷选项可以 横排 或者 竖排 7.界面风格接受客户定制,一个工作日完成 8.本系统出租,按租用天数计费,免去你购买域名和租用服务器的麻烦 9.先进的PHP MYASQL开发,Nginx作为WEB...

    一贝问卷系统 可自定义问卷设置 v6.3.rar

    界面风格均可以后台设置,问卷选项可以 横排 或者 竖排  7.界面风格接受客户定制,一个工作日完成  8.本系统出租,按租用天数计费,免去你购买域名和租用服务器的麻烦  9.先进的PHP MYASQL开发,Nginx作为WEB...

Global site tag (gtag.js) - Google Analytics