Oracle--查

一、固定行列转换

1、Decode方式

SELECT ID,NAME,
SUM(DECODE(course,'语文',score,0)) 语文,--这里使用max,min都可以
SUM(DECODE(course,'数学',score,0)) 数学,
SUM(DECODE(course,'英语',score,0)) 英语,
SUM(DECODE(course,'历史',score,0)) 历史,
SUM(DECODE(course,'化学',score,0)) 化学
FROM kecheng
GROUP BY ID ,NAME

 

2、Case方式

SELECT ID,NAME,
MAX(CASE WHEN course='语文' THEN score ELSE 0 END) 语文,
MAX(CASE WHEN course='数学' THEN score ELSE 0 END) 数学,
MAX(CASE WHEN course='英语' THEN score ELSE 0 END) 英语,
MAX(CASE WHEN course='历史' THEN score ELSE 0 END) 历史,
MAX(CASE WHEN course='化学' THEN score ELSE 0 END) 化学
FROM kecheng
GROUP BY ID ,NAME

结果与上方一样

3、wmsys.wm_concat行列转换函数

 

SELECT ID,NAME,
wmsys.wm_concat(course || ':'||score) course
FROM kecheng
GROUP BY ID ,NAME;

Oracle--查_第1张图片

4、使用over(partition by t.u_id)用法

SELECT NAME,
wmsys.wm_concat(course ||score)  OVER (PARTITION BY NAME)
FROM kecheng

Oracle--查_第2张图片

二、动态转换

1、使用PL/SQL

DECLARE
  --存放最终的SQL
  LV_SQL VARCHAR2(3000);
  --存放连接的SQL
  SQL_COMMOND VARCHAR2(3000);
  --定义游标
  CURSOR CUR IS
    SELECT COURSE FROM KECHENG GROUP BY COURSE;
BEGIN
  --定义查询开头
  SQL_COMMOND := 'SELECT NAME ';

  FOR I IN CUR LOOP
    --将结果相连接
    SQL_COMMOND := SQL_COMMOND || ' ,SUM(DECODE(course,''' || I.COURSE ||
                   ''',score,0)) ' || I.COURSE;
    DBMS_OUTPUT.PUT_LINE(SQL_COMMOND);
  END LOOP;
  SQL_COMMOND := SQL_COMMOND || ' from KECHENG group by name';
  LV_SQL      := 'INSERT INTO temp_ss  ' || SQL_COMMOND;
  DBMS_OUTPUT.PUT_LINE(LV_SQL);
  EXECUTE IMMEDIATE LV_SQL;
END;
temp_ss  表

三、时间与字符串转换

1、时间转字符串

SELECT to_char(MAX(UPDATE_TIME), 'yyyy-mm-dd hh24:mi:ss') as lastUpdateTime,
       to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') as accountTime
  FROM QLK_AREA;

2、字符串转时间再转字符串

SELECT to_char(to_date(MAX(LASTUPDATETIME), 'yyyymmddhh24miss'),
               'yyyy-mm-dd hh24:mi:ss') as lastUpdateTime,
       to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') as accountTime
  FROM PSN_MZ_LHDJXX_BL;

你可能感兴趣的:(Oracle)