2017-01-27 29 views
-1

有人能告訴我下面的oracle查詢有什麼問題嗎? 我想從單個列數據爲5分不同的列一個基於塊的數量和日期作爲常見的情況在oracle中選擇單列表數據到5列列

在此先感謝

select WBD_DATE, WBD_BLOCK_NO, t1.WBD_VALUE, t2.WBD_VALUE, t3.WBD_VALUE, 
     t4.WBD_VALUE, t5.WBD_VALUE 
from WB_BLOCK_DATA, 
    (select WBD_VALUE, WBD_DATE, WBD_BLOCK_NO 
    from WB_BLOCK_DATA 
    where WBD_ATTRIBUTE_ID = '2692583' 
     and trim(to_char(WBD_DATE, 'Month')) = 'January' 
     and to_char(WBD_DATE, 'YYYY')='2017') as t1, 
    (select WBD_VALUE, WBD_DATE, WBD_BLOCK_NO 
    from WB_BLOCK_DATA 
    where WBD_ATTRIBUTE_ID = '2692599' 
     and trim(to_char(WBD_DATE, 'Month')) = 'January' 
     and to_char(WBD_DATE, 'YYYY')='2017') as t2, 
    (select WBD_VALUE, WBD_DATE, WBD_BLOCK_NO 
    from WB_BLOCK_DATA 
    where WBD_ATTRIBUTE_ID = '2692607' 
     and trim(to_char(WBD_DATE, 'Month')) = 'January' 
     and to_char(WBD_DATE, 'YYYY')='2017') as t3, 
    (select WBD_VALUE, WBD_DATE, WBD_BLOCK_NO 
    from WB_BLOCK_DATA 
    where WBD_ATTRIBUTE_ID = '2692615' 
     and trim(to_char(WBD_DATE, 'Month')) = 'January' 
     and to_char(WBD_DATE, 'YYYY')='2017') as t4, 
    (select WBD_VALUE, WBD_DATE, WBD_BLOCK_NO 
    from WB_BLOCK_DATA 
    where WBD_ATTRIBUTE_ID = '2692623' 
     and trim(to_char(WBD_DATE, 'Month')) = 'January' 
     and to_char(WBD_DATE, 'YYYY')='2017') as t5 
where WBD_DATE = t1.WBD_DATE 
    and WBD_DATE = t2.WBD_DATE 
    and WBD_DATE = t3.WBD_DATE 
    and WBD_DATE = t4.WBD_DATE 
    and WBD_DATE = t5.WBD_DATE 
    and WBD_BLOCK_NO = t1.WBD_BLOCK_NO 
    and WBD_BLOCK_NO = t2.WBD_BLOCK_NO 
    and WBD_BLOCK_NO = t3.WBD_BLOCK_NO 
    and WBD_BLOCK_NO = t4.WBD_BLOCK_NO 
    and WBD_BLOCK_NO = t5.WBD_BLOCK_NO 
+1

請添加錯誤消息。很難在沒有的情況下猜測錯誤。 –

回答

1

AS不支持對Oracle表中的別名,但僅限於列;此外,即使對於WB_BLOCK_DATA,您也需要使用別名,或將其列標爲WB_BLOCK_DATA.columnName

select t0.WBD_DATE, t0.WBD_BLOCK_NO, t1.WBD_VALUE, t2.WBD_VALUE, t3.WBD_VALUE,  t4.WBD_VALUE, t5.WBD_VALUE 
from WB_BLOCK_DATA t0, 
    (select WBD_VALUE, WBD_DATE, WBD_BLOCK_NO from WB_BLOCK_DATA where WBD_ATTRIBUTE_ID = '2692583' and trim(to_char(WBD_DATE, 'Month'))='January' and to_char(WBD_DATE, 'YYYY')='2017') t1, 
    (select WBD_VALUE, WBD_DATE, WBD_BLOCK_NO from WB_BLOCK_DATA where WBD_ATTRIBUTE_ID = '2692599' and trim(to_char(WBD_DATE, 'Month'))='January' and to_char(WBD_DATE, 'YYYY')='2017') t2, 
    (select WBD_VALUE, WBD_DATE, WBD_BLOCK_NO from WB_BLOCK_DATA where WBD_ATTRIBUTE_ID = '2692607' and trim(to_char(WBD_DATE, 'Month'))='January' and to_char(WBD_DATE, 'YYYY')='2017') t3, 
    (select WBD_VALUE, WBD_DATE, WBD_BLOCK_NO from WB_BLOCK_DATA where WBD_ATTRIBUTE_ID = '2692615' and trim(to_char(WBD_DATE, 'Month'))='January' and to_char(WBD_DATE, 'YYYY')='2017') t4, 
    (select WBD_VALUE, WBD_DATE, WBD_BLOCK_NO from WB_BLOCK_DATA where WBD_ATTRIBUTE_ID = '2692623' and trim(to_char(WBD_DATE, 'Month'))='January' and to_char(WBD_DATE, 'YYYY')='2017') t5 
    where t0.WBD_DATE = t1.WBD_DATE 
     and t0.WBD_DATE = t2.WBD_DATE 
     and t0.WBD_DATE = t3.WBD_DATE 
     and t0.WBD_DATE = t4.WBD_DATE 
     and t0.WBD_DATE = t5.WBD_DATE 
     and t0.WBD_BLOCK_NO = t1.WBD_BLOCK_NO 
     and t0.WBD_BLOCK_NO = t2.WBD_BLOCK_NO 
     and t0.WBD_BLOCK_NO = t3.WBD_BLOCK_NO 
     and t0.WBD_BLOCK_NO = t4.WBD_BLOCK_NO 
     and t0.WBD_BLOCK_NO = t5.WBD_BLOCK_NO 

例子:

SQL> select dummy from dual x; 

D 
- 
X 

SQL> select dummy from dual as x; 
select dummy from dual as x 
         * 
ERROR at line 1: 
ORA-00933: SQL command not properly ended 


SQL> select dummy as d from dual x; 

D 
- 
X 

SQL> 
+0

感謝您的糾正,我是新手,我只在項目中使用oracle作爲報告目的的一部分。糾正後,我得到錯誤作爲列含糊不清地定義。 –

+0

您需要WB_BLOCK_DATA的別名;請參閱我的編輯 – Aleksej

+0

感謝Aleksej,它完美地工作。 –

1

順便說一句(這真是太長,不適合作爲一個評論,這是它到底是什麼),你正在試圖做的是被稱爲一個樞軸操作。

WITH wb_block_data AS (SELECT to_date('12/01/2017', 'dd/mm/yyyy') wbd_date, 1 wbd_block_no, '2692583' wbd_attribute_id, 10 wbd_value FROM dual UNION ALL 
         SELECT to_date('12/01/2017', 'dd/mm/yyyy') wbd_date, 1 wbd_block_no, '2692599' wbd_attribute_id, 20 wbd_value FROM dual UNION ALL 
         SELECT to_date('12/01/2017', 'dd/mm/yyyy') wbd_date, 1 wbd_block_no, '2692607' wbd_attribute_id, 30 wbd_value FROM dual UNION ALL 
         SELECT to_date('12/01/2017', 'dd/mm/yyyy') wbd_date, 1 wbd_block_no, '2692615' wbd_attribute_id, 40 wbd_value FROM dual UNION ALL 
         SELECT to_date('12/01/2017', 'dd/mm/yyyy') wbd_date, 1 wbd_block_no, '2692623' wbd_attribute_id, 50 wbd_value FROM dual UNION ALL 
         SELECT to_date('12/01/2017', 'dd/mm/yyyy') wbd_date, 1 wbd_block_no, '2692671' wbd_attribute_id, 60 wbd_value FROM dual) 
-- end of mimicking your table with some sample data in it. See SQL below: 
SELECT * 
FROM (SELECT * 
     FROM wb_block_data 
     WHERE wbd_attribute_id IN ('2692583', '2692599', '2692607', '2692615', '2692623') 
     and TRUNC(wbd_date, 'mm') = to_date('01/01/2017', 'dd/mm/yyyy')) 
PIVOT (MAX(wbd_value) FOR (wbd_attribute_id) IN ('2692583' AS attrib_2692583, 
               '2692599' AS attrib_2692599, 
               '2692607' AS attrib_2692607, 
               '2692615' AS attrib_2692615, 
               '2692623' AS attrib_2692623)); 

WBD_DATE WBD_BLOCK_NO ATTRIB_2692583 ATTRIB_2692599 ATTRIB_2692607 ATTRIB_2692615 ATTRIB_2692623 
----------- ------------ -------------- -------------- -------------- -------------- -------------- 
12/01/2017    1    10    20    30    40    50 

如果你是一個早期版本,您可以使用下面的手工做支點:

WITH wb_block_data AS (SELECT to_date('12/01/2017', 'dd/mm/yyyy') wbd_date, 1 wbd_block_no, '2692583' wbd_attribute_id, 10 wbd_value FROM dual UNION ALL 
         SELECT to_date('12/01/2017', 'dd/mm/yyyy') wbd_date, 1 wbd_block_no, '2692599' wbd_attribute_id, 20 wbd_value FROM dual UNION ALL 
         SELECT to_date('12/01/2017', 'dd/mm/yyyy') wbd_date, 1 wbd_block_no, '2692607' wbd_attribute_id, 30 wbd_value FROM dual UNION ALL 
         SELECT to_date('12/01/2017', 'dd/mm/yyyy') wbd_date, 1 wbd_block_no, '2692615' wbd_attribute_id, 40 wbd_value FROM dual UNION ALL 
         SELECT to_date('12/01/2017', 'dd/mm/yyyy') wbd_date, 1 wbd_block_no, '2692623' wbd_attribute_id, 50 wbd_value FROM dual UNION ALL 
         SELECT to_date('12/01/2017', 'dd/mm/yyyy') wbd_date, 1 wbd_block_no, '2692671' wbd_attribute_id, 60 wbd_value FROM dual) 
-- end of mimicking your table with some sample data in it. See SQL below: 
SELECT wbd_date, 
     wbd_block_no, 
     MAX(CASE WHEN wbd_attribute_id = '2692583' THEN wbd_value END) attrib_2692583, 
     MAX(CASE WHEN wbd_attribute_id = '2692599' THEN wbd_value END) attrib_2692599, 
     MAX(CASE WHEN wbd_attribute_id = '2692607' THEN wbd_value END) attrib_2692607, 
     MAX(CASE WHEN wbd_attribute_id = '2692615' THEN wbd_value END) attrib_2692615, 
     MAX(CASE WHEN wbd_attribute_id = '2692623' THEN wbd_value END) attrib_2692623 
FROM wb_block_data 
WHERE wbd_attribute_id IN ('2692583', '2692599', '2692607', '2692615', '2692623') 
and TRUNC(wbd_date, 'mm') = to_date('01/01/2017', 'dd/mm/yyyy') 
GROUP BY wbd_date, wbd_block_no; 

WBD_DATE WBD_BLOCK_NO ATTRIB_2692583 ATTRIB_2692599 ATTRIB_2692607 ATTRIB_2692615 ATTRIB_2692623 
----------- ------------ -------------- -------------- -------------- -------------- -------------- 
12/01/2017    1    10    20    30    40    50 
如果你是在Oracle 11.1或更高版本,可以使用PIVOT運算符做到這一點

請注意,在這兩種情況下,我已經修改謂詞以將日期與日期進行比較,而不是將日期分成兩個字符串,然後對其進行比較。另請注意,我將wbd_date截斷爲月份級別(自動錶示月份的第一天)。這也意味着,如果你想使用一個索引,你只需要定義一個單一的元素:trunc(wbd_date, 'mm')而不是兩個要素:trim(to_char(WBD_DATE, 'Month'))to_char(WBD_DATE, 'YYYY')

+0

謝謝骨科醫生,我在11g檢查它完美的作品。但我將12月的月份和年份作爲YYYY傳遞給我的報告,這就是我正在考慮的兩個元素 –

+0

因此,請執行trunc(wbd_date,'mm')= to_date('01 /'||:p_month || '/'||:p_year,'dd/Month/yyyy')'然後。如果你絕對必須堅持把日期分成兩部分,至少要擺脫修剪並適當修改to_char格式掩碼,以除去多餘的字符:'to_char(WBD_DATE,'fmMonth')'(但我會建議反對將日期列拆分爲兩個字符串,因爲它不如在列上​​運行單個trunc函數的性能更好。) – Boneist