我在表EMP_DATES
中有以下数据。
我想从表中获得以下输出:
我该怎么做?我使用了以下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;
答案 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设置的影响,并且无法按照语言的方式进行更改。