PIVOT / GROUP BY выпуск на ORACLE - PullRequest
       3

PIVOT / GROUP BY выпуск на ORACLE

2 голосов
/ 17 февраля 2012

Мой первый запрос, где у меня возникла проблема: Сложная проблема GROUP BY в ORACLE теперь определенно решена.

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

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

Вот данные, которые помогут вам построить такой вывод. Я попытался снова использовать unpivot / pivot с запросом, который Рене дал мне в решенной проблеме, которую я цитирую, но, к сожалению, я получил ошибку, которая «ORA-56901: непостоянное выражение недопустимо для значений pivot | unpivot» 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 
)

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

Ответы [ 2 ]

1 голос
/ 19 февраля 2012

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

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 голосов
/ 17 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...