2012-02-17 4 views
2

Мой первый запрос, где у меня проблема: Tricky GROUP BY issue on ORACLE теперь определенно разрешен.PIVOT/GROUP BY выпуск на ORACLE

Однако у меня новый вопрос. Я стараюсь, чтобы преобразовать его, еще один раз, чтобы в настоящее время этот вывод:

 
         |   EMAIL   |    WIFI   | ...   
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
     Yes    |    20   |    24   | ...     
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
     No    |    4   |     0   | ...   
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
    Unknown    |    1   |     1   | ... 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

Здесь данные, чтобы помочь вам построить такой вывод. Я попытался снова использовать univot/pivot с запросом, который Рене дал мне в разрешенной проблеме, которую я цитирую, но, к сожалению, я получил ошибку, которая «ORA-56901: не константное выражение не допускается для значений pivot | univot» sighh. ..

 
with 
count_table as (
    select 1001 device_id, 4 quantity from dual union all 
    select 1002 device_id, 20 quantity from dual union all 
    select 1003 device_id, 1 quantity from dual 
), 
device_table as (
    select 1001 id, 'Yes'  wifi, 'No'  email, 'No' bluetooth from dual union all 
    select 1002 id, 'Yes'  wifi, 'Yes'  email, 'No' bluetooth from dual union all 
    select 1003 id, 'Unknown' wifi, 'Unknown' email, 'Yes' bluetooth from dual 
) 

Возможно, есть более простое решение для этого? Мне определенно нужно прочитать книгу о реляционной БД :)

ответ

1

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

with 
count_table as (
    select 1001 device_id, 4 quantity from dual union all 
    select 1002 device_id, 20 quantity from dual union all 
    select 1003 device_id, 1 quantity from dual 
), 
device_table as (
    select 1001 id, 'Yes'  wifi, 'No'  email, 'No' bluetooth from dual union all 
    select 1002 id, 'Yes'  wifi, 'Yes'  email, 'No' bluetooth from dual union all 
    select 1003 id, 'Unknown' wifi, 'Unknown' email, 'Yes' bluetooth from dual 
) 
---------------------------------------- 
select * from (
     select 
     feature, 
     yes_no_unknown, 
     sum(quantity) quantity 
     from 
     count_table c join 
     device_table d on c.device_id = d.id 
     unpivot (yes_no_unknown 
       for feature in (wifi, email, bluetooth) 
    ) 
     group by 
     feature, 
     yes_no_unknown 
) 
pivot (sum (quantity) 
     -- only this line I have changed .. 
     for feature in ('WIFI' as Wifi, 'EMAIL' as Email, 'BLUETOOTH' as Bluetooth) 
); 
+0

Большое спасибо! Он работает, (кстати, есть только опечатка с признаком) Я начинаю понимать эту функцию PIVOT/UNPIVOT лучше;) – Ajantis

0

Если количество столбцов выходной таблицы является гибким, возможно, вы можете использовать какое-то процедурное решение; PL/SQL или Java.

В PL/SQL вы можете создать двухмерную коллекцию и заполнить ее, а затем распечатать. Вы можете создавать/генерировать динамический SQL-запрос с использованием пакета dbms_sql.