2017-09-26 57 views
1

我從表中的數據如下圖所示根據與日期爲串聯標題

╔═════════╦════════════╦═════════════╗ 
║ PROD_ID ║ START_DATE ║ TOT_HOURS ║ 
╠═════════╬════════════╬═════════════╣ 
║ PR220 ║ 19-Sep-17 ║ 0   ║ 
║ PR2230 ║ 19-Sep-17 ║ 2   ║ 
║ PR9702 ║ 19-Sep-17 ║ 3   ║ 
║ PR9036 ║ 19-Sep-17 ║ 0.6   ║ 
║ PR9036 ║ 18-Sep-17 ║ 3.4   ║ 
║ PR9609 ║ 18-Sep-17 ║ 5   ║ 
║ PR91034 ║ 18-Sep-17 ║ 4   ║ 
║ PR7127 ║ 18-Sep-17 ║ 0   ║ 
╚═════════╩════════════╩═════════════╝ 

START_DATE基礎,也纔有可能有一天日期級聯標題列日?

期望輸出是

╔═════════╦════════════╦════════╦════════╦═══════════╗ 
║ PROD_ID ║ START_DATE ║ MON-18 ║ TUE-19 ║ TOT_HOURS ║ 
╠═════════╬════════════╬════════╬════════╬═══════════╣ 
║ PR220 ║ 19-Sep-17 ║  ║ 0  ║ 0   ║ 
║ PR2230 ║ 19-Sep-17 ║  ║ 2  ║ 2   ║ 
║ PR9702 ║ 19-Sep-17 ║  ║ 3  ║ 3   ║ 
║ PR9036 ║ 19-Sep-17 ║  ║ 0.6 ║ 0.6  ║ 
║ PR9036 ║ 18-Sep-17 ║ 3.4 ║  ║ 3.4  ║ 
║ PR9609 ║ 18-Sep-17 ║ 5  ║  ║ 5   ║ 
║ PR91034 ║ 18-Sep-17 ║ 4  ║  ║ 4   ║ 
║ PR7127 ║ 18-Sep-17 ║ 0  ║  ║ 0   ║ 
╚═════════╩════════════╩════════╩════════╩═══════════╝ 

表結構和數據

CREATE TABLE PROD_TIMINGS 
(
    PROD_ID  VARCHAR2(12 BYTE), 
    START_DATE DATE, 
    TOT_HOURS NUMBER 
); 

SET DEFINE OFF; 
Insert into PROD_TIMINGS 
    (PROD_ID, START_DATE, TOT_HOURS) 
Values 
    ('PR220', TO_DATE('09/19/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 0); 
Insert into PROD_TIMINGS 
    (PROD_ID, START_DATE, TOT_HOURS) 
Values 
    ('PR2230', TO_DATE('09/19/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 2); 
Insert into PROD_TIMINGS 
    (PROD_ID, START_DATE, TOT_HOURS) 
Values 
    ('PR9702', TO_DATE('09/19/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 3); 
Insert into PROD_TIMINGS 
    (PROD_ID, START_DATE, TOT_HOURS) 
Values 
    ('PR9036', TO_DATE('09/19/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 0.6); 
Insert into PROD_TIMINGS 
    (PROD_ID, START_DATE, TOT_HOURS) 
Values 
    ('PR9036', TO_DATE('09/18/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 3.4); 
Insert into PROD_TIMINGS 
    (PROD_ID, START_DATE, TOT_HOURS) 
Values 
    ('PR9609', TO_DATE('09/18/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 5); 
Insert into PROD_TIMINGS 
    (PROD_ID, START_DATE, TOT_HOURS) 
Values 
    ('PR91034', TO_DATE('09/18/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 4); 
Insert into PROD_TIMINGS 
    (PROD_ID, START_DATE, TOT_HOURS) 
Values 
    ('PR7127', TO_DATE('09/18/2017 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 0); 
COMMIT; 
+0

https://stackoverflow.com/q/15491661/1509264 – MT0

+0

@ MT0不知道的可能重複爲什麼這是一個重複https://stackoverflow.com/questions/15491661/dynamic-pivot-in-oracle-sql – user75ponic

+0

因爲您似乎想要基於數據透視表生成動態列。 – MT0

回答

1

不是沒有使用動態SQL使查詢。

但是,如果你願意硬編碼值,則:

SQL Fiddle

的Oracle 11g R2架構設置

CREATE TABLE PROD_TIMINGS(PROD_ID, START_DATE, TOT_HOURS) AS 
SELECT 'PR220', DATE '2017-09-19', 0 FROM DUAL UNION ALL 
SELECT 'PR2230', DATE '2017-09-19', 2 FROM DUAL UNION ALL 
SELECT 'PR9702', DATE '2017-09-19', 3 FROM DUAL UNION ALL 
SELECT 'PR9036', DATE '2017-09-19', 0.6 FROM DUAL UNION ALL 
SELECT 'PR9036', DATE '2017-09-18', 3.4 FROM DUAL UNION ALL 
SELECT 'PR9609', DATE '2017-09-18', 5 FROM DUAL UNION ALL 
SELECT 'PR91034', DATE '2017-09-18', 4 FROM DUAL UNION ALL 
SELECT 'PR7127', DATE '2017-09-18', 0 FROM DUAL; 

查詢1

SELECT PROD_ID, 
     START_DATE, 
     CASE START_DATE WHEN DATE '2017-09-18' THEN TOT_HOURS END AS "MON-18", 
     CASE START_DATE WHEN DATE '2017-09-19' THEN TOT_HOURS END AS "TUE-19", 
     TOT_HOURS 
FROM PROD_TIMINGS 

Results

| PROD_ID |   START_DATE | MON-18 | TUE-19 | TOT_HOURS | 
|---------|----------------------|--------|--------|-----------| 
| PR220 | 2017-09-19T00:00:00Z | (null) |  0 |   0 | 
| PR2230 | 2017-09-19T00:00:00Z | (null) |  2 |   2 | 
| PR9702 | 2017-09-19T00:00:00Z | (null) |  3 |   3 | 
| PR9036 | 2017-09-19T00:00:00Z | (null) | 0.6 |  0.6 | 
| PR9036 | 2017-09-18T00:00:00Z | 3.4 | (null) |  3.4 | 
| PR9609 | 2017-09-18T00:00:00Z |  5 | (null) |   5 | 
| PR91034 | 2017-09-18T00:00:00Z |  4 | (null) |   4 | 
| PR7127 | 2017-09-18T00:00:00Z |  0 | (null) |   0 | 
+0

我有開始日期和結束日期作爲參數傳遞,所以有這兩個日期可以以任何方式避免硬編碼? – user75ponic

+0

我必須避免日期和日期的硬編碼。 – user75ponic

+0

不能在數據透視表或列別名中使用動態值 - 您將需要使用硬編碼值或動態SQL來生成查詢(在生成的查詢中使用硬編碼值)。我已經鏈接到一個關於動態pivoting的問題,如果這是你所需要的,那麼這個問題應該作爲一個副本來關閉。 – MT0