Oracle-10g

在具有不同列的單行中添加多行

  • May 2, 2018

我想加入兩個表(它們被稱為寄存器和讀取)。結果,我想獲得 4 列,對應於寄存器 ID。

根據下一個範例,通過連接表,我獲得 2 行。在某些情況下,我可能會找到/獲得 4 行,因為它們存在​​於 Reads 表中。

表:寄存器

   ID      Number    Prod_ID
   331       01       112233
   332       02       112233
   333       03       112233
   334       04       112233

表:讀取

   Read_Id    Register_Id  
     011          331
     012          332

我使用此查詢連結連接兩個表:

   SELECT rg.ID 
   FROM Reads rd LEFT JOIN Registers rg on rd.Register_ID = rg.ID
   WHERE rg.Prod_ID = 112233;

我的結果是下一個:

   ID
   331
   332

我真正想要的是只獲得一行,將第一個結果分配給第一列,將第二個結果分配給第二列,依此類推。此外,我想添加一個額外的列,顯示有多少列包含資訊。

預期結果:

   RegisterID1    RegisterID2    RegisterID3    RegisterID4    Count
       331            332                                        2

有什麼簡單的方法可以做到這一點?非常感謝你!

您使用的是 10g,因此PIVOT不可用,但仍然具有良好的舊sum(case ...).

drop table reads purge;
drop table registers purge;

create table registers (id number,  n varchar2(2), prod_id number);
insert into registers values (331, '01', 112233);
insert into registers values (332, '02', 112233);
insert into registers values (333, '03', 112233);
insert into registers values (334, '04', 112233);
commit;

create table reads (read_id varchar2(3), register_id number);
insert into reads values ('011', 331);
insert into reads values ('012', 332);
commit;

SELECT
 sum(case when rg.n = '01' then rd.register_id end) as "RegisterID1",
 sum(case when rg.n = '02' then rd.register_id end) as "RegisterID2",
 sum(case when rg.n = '03' then rd.register_id end) as "RegisterID3",
 sum(case when rg.n = '04' then rd.register_id end) as "RegisterID4",
 count(rd.register_id) as "Count"
FROM Reads rd RIGHT JOIN Registers rg on rd.Register_ID = rg.ID
WHERE rg.Prod_ID = 112233;

RegisterID1 RegisterID2 RegisterID3 RegisterID4      Count
----------- ----------- ----------- ----------- ----------
       331         332                                  2

引用自:https://dba.stackexchange.com/questions/205485