2016-03-24 4 views
0

私はテーブル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; 

答えて

2

あなたが列にあなたの行を旋回するようにしようとしているが、あなたは、実際のP​​IVOT句を10gのにしているようには使用できません。そう、あなたはそれをcase文と集約して、拡張の方法を実行する必要があります。

SELECT 
    SUM(CASE WHEN TO_CHAR (start_date, 'FMDay') = 'Sunday' THEN 
    ROUND ((completion_date - start_date) * 24, 1) END) AS "Sunday", 
    SUM(CASE WHEN TO_CHAR (start_date, 'FMDay') = 'Monday' THEN 
    ROUND ((completion_date - start_date) * 24, 1) END) AS "Monday", 
    SUM(CASE WHEN TO_CHAR (start_date, 'FMDay') = 'Tuesday' THEN 
    ROUND ((completion_date - start_date) * 24, 1) END) AS "Tuesday", 
    SUM(CASE WHEN TO_CHAR (start_date, 'FMDay') = 'Wednesday' THEN 
    ROUND ((completion_date - start_date) * 24, 1) END) AS "Wednesday", 
    SUM(CASE WHEN TO_CHAR (start_date, 'FMDay') = 'Thursday' THEN 
    ROUND ((completion_date - start_date) * 24, 1) END) AS "Thursday", 
    SUM(CASE WHEN TO_CHAR (start_date, 'FMDay') = 'Friday' THEN 
    ROUND ((completion_date - start_date) * 24, 1) END) AS "Friday", 
    SUM(CASE WHEN TO_CHAR (start_date, 'FMDay') = 'Saturday' THEN 
    ROUND ((completion_date - start_date) * 24, 1) END) AS "Saturday" 
FROM emp_dates; 

    Sunday  Monday Tuesday Wednesday Thursday  Friday Saturday 
---------- ---------- ---------- ---------- ---------- ---------- ---------- 
        3.1  4.9            

'FM' format modifierは、「日」と「Dyを」で、デフォルトでは何が起こるかであるスペースでパディングされto_char()した値を、停止します。それがなければ、テキストリテラルもまた埋められる必要があります。 'Monday '。そのために使用する言語を

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            

私も変わってきた、それは短いだという理由だけで省略曜日名を使用して、指定された - 場合:

は、あなたは少しのコードを簡素化するためにサブクエリを使用することができますこれを実行しているクライアントセッションは英語ではないため、文字列リテラルとの比較が失敗します。 (その詳細についてはin the documentationを読むことができます)。

たとえば、セッション言語がフランス語の場合、to_char()は 'Lundi'となり、固定値 'Monday'と一致しません。比較のために日番号を使用することもできますが、それはNLS設定の影響を受けます。また、言語の変更方法は変更できません。

+0

ありがとうアレックス、これは素晴らしいです、私はあなたのアプローチを試みます。 – user75ponic

+0

Alex、PIVOT関数を使って出力を得る方法を教えてください。 – user75ponic

関連する問題