順便說一句(這真是太長,不適合作爲一個評論,這是它到底是什麼),你正在試圖做的是被稱爲一個樞軸操作。
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')
請添加錯誤消息。很難在沒有的情況下猜測錯誤。 –