Не удается получить нужные данные из запроса SQL - PullRequest
0 голосов
/ 09 января 2012
SELECT     
     a.alloc_date,
     p.plan,
     p.emp_id,
      a.veh,
     a.contri_type,
     a.amount,
     SUM (a.alloc_qty) AS sum_alloc_qty,                    -- 1000 funds distributed
     SUM (a.alloc_qty * a.amount) AS sum_alloc_value,       -- 1000*2 = 2000 
     COUNT (DISTINCT part_id) AS sum_emp_count,             -- 4 employees 
     MAX (a.alloc_qty * a.amount) AS max_value_to_one_emp,  --  600 
     null as "emp_count_with_max_value"                     --  Unable to retrieve -        idealy answer should be 3 in this example
 FROM   
     alloc a, emp p
 WHERE   
     A.alloc_date >= TO_DATE ('20111001', 'YYYYMMDD')
     AND a.emp_id = p.emp_id
GROUP BY   
     a.alloc_date,
     p.plan,
     p.emp_id,
     a.veh,
     a.contri_type,
     a.amount
ORDER BY   
     alloc_date, emp_id, amount

Здесь существующий запрос работает, как показано ниже.

Предположим, что компания распределяет 1000 фондов, при этом цена каждого фонда равна 2.

Теперь эти 1000 фондов распределены.среди 4 сотрудников.

Основной вопрос заключается в получении максимальной суммы средств для одного сотрудника.Предположим, что распределение фонда составляет:

emp1=600 (300*2), emp2=600 (300*2), emp3=600 (300*2), emp4=300 (300*1)

Итак, здесь максимальная стоимость средств на одного сотрудника = 600.

Это я могу теперь получить по запросу.

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

В нашем примере это оказывается3 сотрудника.Но я не могу получить то же самое

Здесь я привел данные только для одной группы.Результирующий вывод запроса должен выглядеть следующим образом:

'11/12/86','abc','E25','pqr','qvr',2,1000,2000,4,600,3

Ответы [ 2 ]

1 голос
/ 09 января 2012

Вам также придется сгруппировать по alloc_qty, но если вы используете это:

count(*) keep (dense_rank last order by A.ALLOC_QTY * A.AMOUNT) over () as "emp_count_with_max_value"

Это должно вернуть количество записей, соответствующих максимуму. Итак, в вашем коде это должно быть что-то вроде:

SELECT     a.alloc_date,
       p.plan,
       p.emp_id,
       a.veh,
       a.contri_type,
       a.amount,
       SUM (a.alloc_qty) AS sum_alloc_qty,                    -- 1000 funds distributed
       SUM (a.alloc_qty * a.amount) AS sum_alloc_value,       -- 1000*2 = 2000 
       COUNT (DISTINCT part_id) AS sum_emp_count,             -- 4 employees 
       MAX (a.alloc_qty * a.amount) AS max_value_to_one_emp,  --  600 
       count(*) keep (dense_rank last order by A.ALLOC_QTY * A.AMOUNT) over () as "emp_count_with_max_value"                     --  Unable to retrieve -           idealy answer should be 3 in this example
    FROM   alloc a, emp p
   WHERE   A.alloc_date >= TO_DATE ('20111001', 'YYYYMMDD')
       AND a.emp_id = p.emp_id
GROUP BY   a.alloc_qty,
       a.alloc_date,
       p.plan,
       p.emp_id,
       a.veh,
       a.contri_type,
       a.amount
ORDER BY   alloc_date,
       emp_id,
       amount

Вы также можете изменить свой sum_emp_count на

COUNT (DISTINCT part_id) over ()

и max_value_to_one_emp до

MAX (a.alloc_qty * a.amount) over ()

В противном случае вы не получите значение для всего набора данных.

1 голос
/ 09 января 2012

В принципе, если вы ранжируете распределение сотрудников, легко определить, кто получил наибольшую сумму.Затем вам нужно выполнить внешний запрос, чтобы рассчитать количество счастливых собак.

select alloc_date,
       plan,
       emp_id,
       veh,
       contri_type,
       amount,
       sum_alloc_qty,                    
       sum_alloc_value,      
       sum_emp_count,      
       max_value_to_one_emp,  
       sum ( case when rnk = 1 then 1 else 0 end ) as emp_count_with_max_value
from (
    SELECT     a.alloc_date,
           p.plan,
           p.emp_id,
           a.veh,
           a.contri_type,
           a.amount,
           SUM (a.alloc_qty) AS sum_alloc_qty,                    -- 1000 funds distributed
           SUM (a.alloc_qty * a.amount) AS sum_alloc_value,       -- 1000*2 = 2000 
           COUNT (DISTINCT part_id) AS sum_emp_count,             -- 4 employees 
           MAX (a.alloc_qty * a.amount) AS max_value_to_one_emp,  --  600 
           dense_rank() over  (order by a.alloc_qty desc)      rnk  -- rank allocation in descending order
           FROM   alloc a, emp p
       WHERE   A.alloc_date >= TO_DATE ('20111001', 'YYYYMMDD')
           AND a.emp_id = p.emp_id
    GROUP BY   a.alloc_date,
           p.plan,
           p.emp_id,
           a.veh,
           a.contri_type,
           a.amount
)
group by alloc_date,
       plan,
       emp_id,
       veh,
       contri_type,
       amount,
       sum_alloc_qty,                    
       sum_alloc_value,      
       sum_emp_count,      
       max_value_to_one_emp
ORDER BY   alloc_date,
       emp_id,
       amount

Примечание: в отсутствие тестовых данных я не тестировал этот код и не гарантирую, что он не содержит ошибок.Однако принцип - это звук.

...