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

ここでは、既存のクエリは次のように機能しています。

会社が1000のファンドを配布していて、各ファンドの価格が2であるとします。

現在、これらの1000の資金は4人の従業員に分配されています。

基本的な問題は、1人の従業員の資金の最大値を取得することです。仮に、資金の分配は次のとおりです。

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

したがって、ここでは1人の従業員に対する資金の最大値=600です。

これは、クエリによって取得できるようになりました。

しかし、次の問題は、emp_count_with_max_value各グループでこの最大値を与えられた従業員の数を持つはずの別の列()を取得することです。

この例では、3人の従業員であることがわかります。しかし、私は同じものを取得することはできません

ここでは、1つのグループのデータのみを示しました。結果のクエリ出力は次のようになります。

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

2 に答える 2

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

注:テストデータがない場合、私はこのコードをテストしていません。また、バグがないことを保証するものではありません。しかし、原則は健全です。

于 2012-01-09T13:41:54.190 に答える
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 ()

そうしないと、すべてのデータセットの値を取得できません。

于 2012-01-09T13:43:01.113 に答える