2013-05-20 2 views
0

Допустим, у меня есть таблица в базе данных ORACLE, как:Как построить SQL-запрос для извлечения разных строк из одной таблицы в разных столбцах?

ACC_ID | ACC_AMT 
111 | 10000 
111 | 12000 
111 | 14000 
222 | 25000 
222 | 30000 
333 | 18000 
333 | 27000 
333 | 13000 
333 | 15000 

Я хочу, чтобы получить выход как:

ACC_ID_1 | ACC_AMT_1 | ACC_ID_2 | ACC_AMT_2 | ACC_ID_3 | ACC_AMT_3 
111  | 10000  | 222  | 25000  | 333  | 18000 
111  | 12000  | 222  | 30000  | 333  | 27000 
111  | 14000  | null  | null  | 333  | 13000 
null  | null  | null  | null  | 333  | 15000 

мне нужно каждый различный ACC_ID с ACC_AMT в разных колонках. В таблице также может быть другой другой идентификатор ACC_ID, но я приведу только то, что мне нужно. Каков наилучший способ сделать это?

До сих пор я попытался это:

SELECT 
(CASE WHEN ACC_ID=111 THEN ACC_ID END) AS ACC_ID_1, 
(CASE WHEN ACC_ID=111 THEN ACC_AMT END) AS ACC_AMT_1, 
(CASE WHEN ACC_ID=222 THEN ACC_ID END) AS ACC_ID_2, 
(CASE WHEN ACC_ID=222 THEN ACC_AMT END) AS ACC_AMT_2, 
(CASE WHEN ACC_ID=333 THEN ACC_ID END) AS ACC_ID_3, 
(CASE WHEN ACC_ID=333 THEN ACC_AMT END) AS ACC_AMT_3 
FROM <TABLE_NAME> 

Но я не получаю желаемого результата.

+0

Как один сделать связь между 111 и 222 в вашем примере? Является ли '111 | 10000 | 222 | 30000' столь же действительным, как' 111 | 10000 | 222 | 25000', или существует какая-то неявная логика, которую вы не определили? – billinkc

+0

@Sanpopo До сих пор в SQL добавлен SQL-код. -Благодаря. – user2401587

+0

@ user2401587 - у вас есть только три возможных значения для столбца 'acc_id', т. Е. 111, 222 и 333? –

ответ

0

Спасибо, ребята. Но я получил ответ от: http://www.orafaq.com/forum/t/187775/178634/

with 
    data as (
     select acc_id, acc_amt, 
      dense_rank() over(order by acc_id) rk, 
      row_number() over(partition by acc_id order by acc_amt) rn 
     from t 
    ) 
    select max(decode(rk, 1, acc_id)) acc_id_1, 
     max(decode(rk, 1, acc_amt)) acc_amt_1, 
     max(decode(rk, 2, acc_id)) acc_id_2, 
     max(decode(rk, 2, acc_amt)) acc_amt_2, 
     max(decode(rk, 3, acc_id)) acc_id_3, 
     max(decode(rk, 3, acc_amt)) acc_amt_3 
    from data 
    group by rn 
    order by rn 
/
0

раздел Использование поворота может помочь вам, Link

+0

Я использую Oracle 10, но PIVOT доступен только от Oracle 11. Любые другие мысли? – user2401587

+0

Вы можете делать случаи в своем запросе, но это как-то жестко закодированная опция .... и в вашем коде ниже SELECT (CASE WHEN ACC_ID = 111 THEN ACC_ID END) AS ACC_ID_1, (CASE WHEN ACC_ID = 111 THEN ACC_AMT END) А.С. ACC_AMT_1, (случай, когда ACC_ID = 222 ТОГДА ACC_ID КОНЕЦ) КАК ACC_ID_2, (случай, когда ACC_ID = 222 ТОГДА ACC_AMT КОНЕЦ) КАК ACC_AMT_2, (случай, когда ACC_ID = 333 ТОГДА ACC_ID КОНЕЦ) КАК ACC_ID_3, (случай, когда ACC_ID = 333 THEN ACC_AMT END) AS ACC_AMT_3 FROM Вы делаете случай КОГДА ACC = 111, то и т. Д. Вы пишете эту строку два раза, как вы гарантируете sql, какую строку выполнить, когда –

+0

Я написал это условие дважды для ACC_ID и ACC_AMT, но это не имеет значения, даже если я хочу получите только ACC_AMT для разных ACC_ID, я все равно столкнусь с той же проблемой. – user2401587

0

Comment and situation

Вы можете попробовать следующий запрос -

select table1.acc_id acc_id_1,table1.acc_amt acc_amt_1, 
     table2.acc_id acc_id_2,table2.acc_amt acc_amt_2,  
     table3.acc_id acc_id_3,table3.acc_amt acc_amt_3, 
     table4.acc_id acc_id_4,table4.acc_amt acc_amt_4, 
     table5.acc_id acc_id_5,table5.acc_amt acc_amt_5, 
     table6.acc_id acc_id_6,table6.acc_amt acc_amt_6, 
     table7.acc_id acc_id_7,table7.acc_amt acc_amt_7, 
     table8.acc_id acc_id_8,table8.acc_amt acc_amt_8, 
     table9.acc_id acc_id_9,table9.acc_amt acc_amt_9, 
     table10.acc_id acc_id_10,table10.acc_amt acc_amt_10 
from 
(select acc_id, acc_amt, rownum rn from <Table_name> where acc_id = '111') table1 
full outer join 
(select acc_id, acc_amt, rownum rn from <Table_name> where acc_id = '222') table2 
on table2.rn = table1.rn 
full outer join 
(select acc_id, acc_amt, rownum rn from <Table_name> where acc_id = '333') table3 
on table3.rn = table1.rn 
full outer join 
(select acc_id, acc_amt, rownum rn from <Table_name> where acc_id = '444') table4 
on table4.rn = table1.rn 
full outer join 
(select acc_id, acc_amt, rownum rn from <Table_name> where acc_id = '555') table5 
on table5.rn = table1.rn 
full outer join 
(select acc_id, acc_amt, rownum rn from <Table_name> where acc_id = '666') table6 
on table6.rn = table1.rn 
full outer join 
(select acc_id, acc_amt, rownum rn from <Table_name> where acc_id = '777') table7 
on table7.rn = table1.rn 
full outer join 
(select acc_id, acc_amt, rownum rn from <Table_name> where acc_id = '888') table8 
on table8.rn = table1.rn 
full outer join 
(select acc_id, acc_amt, rownum rn from <Table_name> where acc_id = '999') table9 
on table9.rn = table1.rn 
full outer join 
(select acc_id, acc_amt, rownum rn from <Table_name> where acc_id = '101') table10 
on table10.rn = table1.rn 

Это должно дать вам выход, как вам требуется.

+0

Ваше решение работает только для 8-10 JOINS. Мне нужно получить 19 разных ACC_ID, для которых система становится повешенной, когда я пытаюсь подключиться к 19 таблицам. :( Любые другие мысли? – user2401587

+0

@ user2401587 в вашем предыдущем требовании, которое вы рассказали только о 10 acc_id. хорошо .. это зависит от вашего размера стола. он может зависать даже в 2 соединениях, если количество строк в таблице очень велико. На данный момент это единственное решение пришло мне в голову. Посмотрим, что сможем сделать для этого что-нибудь. –

+0

Спасибо, Пратик. Очень ценю вашу помощь. – user2401587

Смежные вопросы