2012-01-09 72 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

你尝试了什么? – 2012-01-09 13:00:40

+0

您的结果中每组有多少行?每个员工有一行吗? – 2012-01-09 13:05:12

+0

@Scott:我试图使用count(*)(由MAX分区(a.alloc_qty * a.amount))作为“emp_count_with_max_value”.....但它给了我错误的输出 – 2012-01-09 13:05:33

回答

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

:谢谢atleast我知道我该怎么发起.... ur天才 – 2012-01-10 06:57:24

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() 

否则你不会获得所有数据集的价值。