Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle SQL - динамичен случай

Имате нужда от функция PIVOT с дефиниране на динамични колони. Най-простият начин е pivot xml:

create table tst_data (id int primary key, source varchar2(255));

insert into tst_data values (1, 'INTERNET');
insert into tst_data values (2, 'DEMO');
insert into tst_data values (3, 'INTERNET');
insert into tst_data values (4, 'SALES');
insert into tst_data values (5, 'INTERNET');
insert into tst_data values (6, 'DEMO');
insert into tst_data values (7, 'INTERNET');
insert into tst_data values (8, 'COM');

commit;

select * from (
  select source from tst_data
) 
pivot xml 
(
  count(1)
  for source in (select distinct t.source from tst_data t)
)  

След като трябва да обработите XML данни:

<PivotSet>
    <item>
        <column name = "SOURCE">COM</column>
        <column name = "COUNT(1)">1</column>
    </item>
    <item>
        <column name = "SOURCE">DEMO</column>
        <column name = "COUNT(1)">2</column>
    </item>
    <item>
        <column name = "SOURCE">INTERNET</column>
        <column name = "COUNT(1)">4</column>
    </item>
    <item>
        <column name = "SOURCE">SALES</column>
        <column name = "COUNT(1)">1</column>
    </item>
</PivotSet>

PIVOT XML поддържа дефиниране на динамични колони (for source in (select distinct t.source from tst_data t) ) обаче връща XML данни. Extractvalue и xmltable функциите позволяват да се правят заявки за определени колони от XML от страната на сървъра, но трябва да посочите имена на полета предварително. Така че предполагам да го анализирам от страна на клиента.

Ако искате да направите всичко на DB-слой, има друг подход. PIVOT (не XML) изисква имена на колони for source in ('INTERNET', 'DEMO', 'COM', ...) . Възможно е да генерирате такава заявка и да върнете курсор към страната на клиента:

CREATE OR REPLACE FUNCTION FUNCTION1 RETURN SYS_REFCURSOR AS 
 cur sys_refcursor;
BEGIN
  open cur for 'select * from dual'; // generate PIVOT query here
  RETURN cur;
END FUNCTION1;

Не знам никакъв метод за създаване на проста нетипизирана заявка от курсора (от страната на сървъра), така че ако желаете да използвате обикновена SQL заявка, направете го в две стъпки:

  1. Генериране на PIVOT заявка с именувани колони в PL/SQL функция;
  2. Изпълнете заявката от вашия клиент.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получа списък със заключени потребители в база данни на Oracle?

  2. Извличане на пълно времево клеймо (включена дата) от заявка за избор; Оракул

  3. Как да получа информация за проследяване за обвързващи променливи, предадени през OracleParameter в ODP.NET?

  4. oracle ExecuteNonQuery замръзва на ASP.Net

  5. Конфигурирайте Hibernate да използва SYS_GUID() на Oracle за първичен ключ