2012-01-09 1 views
0
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 

Здесь существующий запрос работает, как показано ниже.Не удалось получить желаемые данные из запроса sql

Предположим, компания распределяет 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 
+0

Что вы попробовали? –

+0

Сколько строк на группу у вас есть в вашем результате? У вас есть одна строка на одного сотрудника? –

+0

@Scott: Я пытаюсь использовать count (*) over (partition by MAX (a.alloc_qty * a.amount)) как «emp_count_with_max_value» ..... но это дает мне неправильный вывод –

ответ

1

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

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 

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

+0

: Спасибо, что я знаю, как я могу начать ... ур гений –

1

Вы собираетесь должны группе 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() 

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