从日期记录中获取日期作为列标题

时间:2016-03-24 12:34:23

标签: sql oracle11g oracle10g

我在表EMP_DATES中有以下数据。

enter image description here

我想从表中获得以下输出:

enter image description here

我该怎么做?我使用了以下SQL查询,但不确定如何将Day作为列标题。

SELECT TO_CHAR (start_date, 'Day'),
       TO_CHAR (completion_date, 'Day'),
       start_date,
       completion_date,
       ROUND ( (completion_date - start_date) * 24, 1)
  FROM emp_dates

表:

CREATE TABLE EMP_DATES
(
   START_DATE        DATE,
   COMPLETION_DATE   DATE
);


SET DEFINE OFF;

INSERT INTO EMP_DATES (START_DATE, COMPLETION_DATE)
     VALUES (
               TO_DATE ('02/29/2016 12:24:25', 'MM/DD/YYYY HH24:MI:SS'),
               TO_DATE ('02/29/2016 15:30:00', 'MM/DD/YYYY HH24:MI:SS'));

INSERT INTO EMP_DATES (START_DATE, COMPLETION_DATE)
     VALUES (
               TO_DATE ('03/01/2016 07:00:00', 'MM/DD/YYYY HH24:MI:SS'),
               TO_DATE ('03/01/2016 11:54:25', 'MM/DD/YYYY HH24:MI:SS'));

COMMIT;

1 个答案:

答案 0 :(得分:2)

您尝试将行转移到列中,但是当您使用10g时,实际的PIVOT子句不可用;所以你需要用case语句和聚合的扩展方式来做它:

to_char()

'FM' format modifier会停止'Monday '用空格填充所产生的值,默认情况下会发生这样的情况:' Day'和' Dy&#39 ;;没有它,文本文字也需要填充,例如SELECT SUM(CASE WHEN dy = 'Sun' THEN hours END) AS "Sunday", SUM(CASE WHEN dy = 'Mon' THEN hours END) AS "Monday", SUM(CASE WHEN dy = 'Tue' THEN hours END) AS "Tuesday", SUM(CASE WHEN dy = 'Wed' THEN hours END) AS "Wednesday", SUM(CASE WHEN dy = 'Thu' THEN hours END) AS "Thursday", SUM(CASE WHEN dy = 'Fri' THEN hours END) AS "Friday", SUM(CASE WHEN dy = 'Sat' THEN hours END) AS "Saturday" FROM ( SELECT TO_CHAR (start_date, 'FMDy', 'NLS_DATE_LANGUAGE=English') AS dy, ROUND ( (completion_date - start_date) * 24, 1) AS hours FROM emp_dates ); Sunday Monday Tuesday Wednesday Thursday Friday Saturday ---------- ---------- ---------- ---------- ---------- ---------- ---------- 3.1 4.9

您可以使用子查询来简化代码:

to_char()

我也改变了使用缩写日期名称只是因为它更短,并指定了用于此的语言 - 如果运行此命令的客户端会话不是英语,会使与字符串文字的比较失败。 (您可以阅读有关in the documentation)的更多信息。

在第一个版本中,例如,如果会话语言是法语,则{{1}}将获得“Lundi”,这与固定值“周一”不匹配。 。您还可以使用日期编号进行比较,但这也受到NLS设置的影响,并且无法按照语言的方式进行更改。