欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

请教sql行列转换这种效果如何写

更新时间: 2014-01-05 02:14:33 责任编辑: Author_N1

 

请问SQL行列转换这种效果怎么写?
我知道是要进行行列转换,但是写了半天,效果不对。
这个是效果图:

下面是数据库中的值:

下面是我的SQL:
select to_char(run_date, 'yyyy-mm-dd') as run_date,
       max(case team_name when '甲值' then team_name else '' end) as jiazhi,
       max(case team_name when '乙值' then team_name else '' end) as yizhi,
       max(case team_name when '丙值' then team_name else '' end) as binzhi,
       max(case team_name when '丁值' then team_name else '' end) as dinzhi,
       max(case team_name when '戊值' then team_name else '' end) as wuzhi,
       begin_time
  from V_work_time t group by run_date,team_name,begin_time order by t.run_date desc,begin_time asc

下面是我的sql执行效果:

同一天的甲乙丙丁戊不在同一行,还有后面的begin_time不知道如何处理,麻烦大家给点提示或者帮忙写一下,谢谢。
--参考方法--
如果你确定只有5个值,那就硬连接起来就行了,可惜不是每个team_name都有run_date,连接有空值处理麻烦……
换个方式大概像这样


select SUM(run_date) '值班日期',SUM(jia) '甲值时间',SUM(yi) '乙值时间',SUM(bing) '丙值时间',SUM(ding) '丁值时间',SUM(wu) '戊值时间'
from (
select run_date,begin_time jia,0 yi,0 bing,0 ding,0 wu
from V_work_time where team_name='甲值'
union all
select run_date,0 jia,begin_time yi,0 bing,0 ding,0 wu
from V_work_time where team_name='乙值'
union all
select run_date,0 jia,0 yi,begin_time bing,0 ding,0 wu
from V_work_time where team_name='丙值'
union all
select run_date,0 jia,0 yi,0 bing,begin_time ding,0 wu
from V_work_time where team_name='丁值'
union all
select run_date,0 jia,0 yi,0 bing,0 ding,begin_time wu
from V_work_time where team_name='戊值'
);


值班时间为0的就是不值班的

啥!?你说有0点值班的?呵呵呵呵
--参考方法--
oracle没有主键 还是自己手动添加 
插入时间的时候 也是自己转换的  小麻烦了点 

下面是通过动态sql写出来的  有执行结果

CREATE OR REPLACE PROCEDURE T_TEST
IS
  V_SQL NVARCHAR2(2000); 
  CURSOR CURSOR_1 IS
  SELECT team_name 
  FROM teamtab T;
 
    BEGIN
      V_SQL := 'SELECT run_date ';
      FOR V_TB IN CURSOR_1
      LOOP
        V_SQL := V_SQL 
--参考方法--
 ',' 
--参考方法--
 'MAX(DECODE(A.team_name,'''
              
--参考方法--
 V_TB.team_name 
--参考方法--
 ''',DECODE(TIME_ID,1,''一'',2,''二'',3,''三'',4,''四''),NULL)) AS "'
--参考方法--
 V_TB.team_name 
--参考方法--
'"';
      END LOOP;
      V_SQL := V_SQL 
--参考方法--
 ' FROM  teamtab a,runtab b' ;
      V_SQL := V_SQL 
--参考方法--
 ' WHERE A.TEAM_ID = B.TEAM_ID';
      V_SQL := V_SQL 
--参考方法--
 ' GROUP BY RUN_DATE ORDER BY RUN_DATE';
     DBMS_OUTPUT.PUT_LINE(V_SQL);
    --EXECUTE IMMEDIATE V_SQL;
    END;


      RUN_DATE     甲    乙    丙    丁    戊    己
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:14:33
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/7426/
本文WWW.DOC100.NET DOC100.NET版权所有。