Как я могу преобразовать строку в столбец таблицы в Oracle SQL Output? - PullRequest
0 голосов
/ 16 апреля 2019

Я хочу преобразовать свой вывод SQL Server в строку данных таблицы в столбец.

Мой вывод SQL как

ITEM    | RESULT
-----------------
Shell   | 296.5
-----------------
Shell   | 299.8
-----------------
Shell   | 311
-----------------
Shell   | 289
-----------------
Lining  | 301.33
-----------------
Lining  | 296.5
-----------------
Lining  | 299
-----------------

Но я хочу вывод как -

Shell    |   Lining
----------------------
296.5    |  301.33
----------------------
299.8    |  296.5
----------------------
311      |  299
----------------------
289      |  0 -- 

Если какой-либо элемент имеет меньший результат, он будет заполнен нулями (0)

Поэтому, пожалуйста, предложите мне SQL-код, который будет выполнять мое требование. Спасибо

Ответы [ 4 ]

0 голосов
/ 16 апреля 2019

Вы можете сделать Pivot, используя номер строки, чтобы не потерять значение в вашей группе при использовании макс.

with cte as (
select 'Shell' as Item,   '296.5'  as Resultn from dual  union all 
select 'Shell' as Item,   '299.8'  as Resultn from dual  union all 
select 'Shell' as Item,   '311'    as Resultn from dual  union all 
select 'Shell' as Item,   '289'    as Resultn from dual  union all 
select 'Lining' as Item,  '301.33' as Resultn from dual  union all 
select 'Lining' as Item,  '296.5'  as Resultn from dual  union all 
select 'Lining' as Item,  '299'    as Resultn from dual   )

select nvl(Shell,0) Shell, nvl(Lining,0) Lining from (
select  c.item, c.Resultn, row_number() over (partition by Item order by Resultn) rownumn   
from cte c 
) z 
pivot 
(
max(Resultn) 
for item in ('Shell' as Shell  ,'Lining' as Lining ));

Выход:

SHELL   LINING
289     296.5
296.5   299
311      0
299.8   301.33
0 голосов
/ 16 апреля 2019

можно использовать условное агрегирование

select max(case when ITEM='Shell' then RESULT end) as shell,
max(case when ITEM='Lining' then RESULT end) as Lining
from 
  ( select *,row_number() over(partition by item order by result) rn from 
    tablename
  )A
group by rn
0 голосов
/ 16 апреля 2019

Вам необходимо сделать pivot, как указано ниже. Но вам нужна агрегатная функция для стержня. Вам нужно выбрать еще один столбец из таблицы, для группировки.

SELECT * FROM 
(SELECT Item, Result
FROM Table1) 
PIVOT
(
  SUM(Result) FOR ITEM IN ('SHELL' Shell,'LINING' Lining) 
)
0 голосов
/ 16 апреля 2019

PIVOT - это то, что вы ищете. посмотрите здесь: https://www.techonthenet.com/oracle/pivot.php

...