Неправильно группируется запрос Oracle SQL Pivot - PullRequest
0 голосов
/ 24 ноября 2018

Для каждого сотрудника в базе данных я пытаюсь составить список общего количества проданных товаров, которые принесли определенную сумму прибыли (если они продали какую-либо), т.е.

+--------------+----------+----------+----------+
| EmployeeName | Product1 | Product2 | Product3 |
+--------------+----------+----------+----------+
| John Smith   |        4 |        7 |        1 |
+--------------+----------+----------+----------+

где Product1, Product2 и Product3 представляют продукты с идентификаторами 1, 2 и 3, которые, как оказалось, принесли> x прибыль.

У меня есть решение, которое представляет собой динамический центр, в котором я нахожу идентификаторы продуктовкоторые принесли> x прибыли, и с помощью LISTAGG создают предложения SELECT и PIVOT.Однако когда я запускаю запрос к тестовому набору данных, подавляющее большинство выходных данных состоит из пустых полей в столбцах Productn, и у каждого сотрудника есть много записей, которые не сгруппированы.

Я думаю, что этопотому что входные данные в сводную не фильтруются для удаления продуктов, которые не сделали> х, но я не знаю, как я могу отфильтровать его, пока еще используется сводная, так как я не могу использовать GROUP BY / HAVING или WHERE.

На данный момент у меня есть следующий запрос:

SELECT FName || '' '' || LName AS EmployeeName, ' || selectClause || ' FROM STAFF_ORDERS
INNER JOIN STAFF ON STAFF_ORDERS.StaffID = STAFF.StaffID
INNER JOIN STAFF_EXP_TOTALS ON STAFF_EXP_TOTALS.StaffID = STAFF_ORDERS.StaffID
INNER JOIN ORDER_PRODUCTS ON STAFF_ORDERS.OrderID = ORDER_PRODUCTS.OrderID
PIVOT (SUM(ProductQuantity) FOR ProductID IN ('|| pivotClause || ')) ORDER BY TotalValueSold DESC

Раздел текущего вывода выглядит следующим образом: current output

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

Спасибо,

Джеймс

1 Ответ

0 голосов
/ 24 ноября 2018

Для следующих запросов использовались упрощенная таблица STAFF_ORDERS и (пример) HR.EMPLOYEES таблица (Oracle 12c).Принцип: объедините все необходимые таблицы, сводку и фильтр.Может быть, этот пример поможет вам -

Тестовые таблицы и данные

create table staff_orders (
  id           number primary key
, employee_id  number
, product_code varchar2( 5 )
, quantity     number
);

insert into staff_orders values ( 1, 101, 'A', 10);
insert into staff_orders values ( 2, 101, 'B', 20);
insert into staff_orders values ( 3, 101, 'C', 30);
insert into staff_orders values ( 4, 102, 'A', 40);
insert into staff_orders values ( 5, 102, 'C', 50);
insert into staff_orders values ( 6, 103, 'A', 60);
insert into staff_orders values ( 7, 103, 'B', 70);
insert into staff_orders values ( 8, 103, 'C', 80);
insert into staff_orders values ( 9, 103, 'D', 90);
insert into staff_orders values (10, 104, 'A', 100);
insert into staff_orders values (11, 101, 'A', 10);
insert into staff_orders values (12, 101, 'B', 20);
insert into staff_orders values (13, 101, 'C', 30);
insert into staff_orders values (14, 102, 'A', 40);
insert into staff_orders values (15, 102, 'C', 50);
insert into staff_orders values (16, 103, 'A', 60);
insert into staff_orders values (17, 103, 'B', 70);
insert into staff_orders values (18, 103, 'C', 80);
insert into staff_orders values (19, 103, 'D', 90);
insert into staff_orders values (20, 104, 'A', 100);
commit;

Таблица STAFF_ORDERS

select * from staff_orders;

        ID EMPLOYEE_ID PRODU   QUANTITY
---------- ----------- ----- ----------
         1         101 A             10
         2         101 B             20
         3         101 C             30
         4         102 A             40
         5         102 C             50
         6         103 A             60
         7         103 B             70
         8         103 C             80
         9         103 D             90
        10         104 A            100
-- etc...

Таблица HR.EMPLOYEES

select employee_id, first_name, last_name
from hr.employees
where employee_id in ( 101, 102, 103, 104 ) ;

EMPLOYEE_ID  FIRST_NAME  LAST_NAME  
102          Lex         De Haan    
104          Bruce       Ernst      
103          Alexander   Hunold     
101          Neena       Kochhar 

Присоединитесь к таблицам и скорректируйте столбцы по мере необходимости.

select 
  E.employee_id
, E.first_name || ' ' || E.last_name as employee_name
, O.product_code
, O.quantity
from hr.employees E
  join staff_orders O on E.employee_id = O.employee_id ;

EMPLOYEE_ID  EMPLOYEE_NAME     PRODUCT_CODE  QUANTITY  
101          Neena Kochhar     C             30        
101          Neena Kochhar     B             20        
101          Neena Kochhar     A             10        
101          Neena Kochhar     C             30        
101          Neena Kochhar     B             20        
101          Neena Kochhar     A             10        
102          Lex De Haan       C             50        
-- ...
103          Alexander Hunold  C             80        
103          Alexander Hunold  B             70        
103          Alexander Hunold  A             60        
104          Bruce Ernst       A             100       
104          Bruce Ernst       A             100  

Сводка -> сумма количеств.

select *
from (
  select 
    E.employee_id
  , E.first_name || ' ' || E.last_name as employee_name
  , O.product_code
  , O.quantity
  from hr.employees E
    join staff_orders O on E.employee_id = O.employee_id
)
pivot  (  
  sum( quantity ) as total for ( product_code ) in (
    'A' AS product_a
  , 'B' AS product_b
  , 'C' AS product_c
  )
)
;

EMPLOYEE_ID  EMPLOYEE_NAME     PRODUCT_A_TOTAL  PRODUCT_B_TOTAL  PRODUCT_C_TOTAL  
104          Bruce Ernst       200              NULL             NULL             
102          Lex De Haan       80               NULL             100              
103          Alexander Hunold  120              140              160              
101          Neena Kochhar     20               40               60 

Фильтр: всего продукта> 100 (добавьте предложение WHERE кпредыдущий запрос).

select *
from (
  select 
    E.employee_id
  , E.first_name || ' ' || E.last_name as employee_name
  , O.product_code
  , O.quantity
  from hr.employees E
    join staff_orders O on E.employee_id = O.employee_id
)
pivot  (  
  sum( quantity ) as total for ( product_code ) in (
    'A' AS product_a
  , 'B' AS product_b
  , 'C' AS product_c
  )
)
where product_a_total > 100
   or product_b_total > 100  -- use AND here if need be
   or product_c_total > 100  -- use AND here if need be 
;

EMPLOYEE_ID  EMPLOYEE_NAME     PRODUCT_A_TOTAL  PRODUCT_B_TOTAL  PRODUCT_C_TOTAL  
104          Bruce Ernst       200              NULL             NULL             
103          Alexander Hunold  120              140              160 
...