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

请问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
     &n