当前位置: 代码迷 >> Oracle开发 >> 请教SQL行列转换这种效果如何写
  详细解决方案

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

热度:98   发布时间:2016-04-24 06:54:57.0
请问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     甲    乙    丙    丁    戊    己
  相关解决方案