无法从 sql 查询中检索所需数据

Posted

技术标签:

【中文标题】无法从 sql 查询中检索所需数据【英文标题】:Not able to retrieve desired data from sql query 【发布时间】:2012-01-09 12:49:48 【问题描述】:
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

【问题讨论】:

您的结果中每组有多少行?您是否每个员工只有一排? @Scott:我正在尝试使用 count(*) over(按 MAX (a.alloc_qty * a.amount) 分区)作为“emp_count_with_max_value”......但它给了我错误的输出 @aF: 现有查询为每个组提供一条记录 ....但在内部它是对 4 名员工 (emp1,2,3...4 ) 进行分组,如示例所示 @user1138658 那你为什么不使用内部结果并对拥有a.alloc_qty * a.amount equal to max_value_to_one_emp的员工进行count()? @aF.: 那是我做不到的:( 【参考方案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

注意:在没有测试数据的情况下,我没有测试过这段代码,我不保证它没有错误。不过原理还是不错的。

【讨论】:

【参考方案2】:

你也必须按 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 ()

否则您将无法获得所有数据集的值。

【讨论】:

以上是关于无法从 sql 查询中检索所需数据的主要内容,如果未能解决你的问题,请参考以下文章

如何检索oracle sql查询的进度?

ms 访问查询仅检索所需的值

使用 JDBC 根据用户输入从 SQL 数据库中检索数据? [复制]

无法从 .NET OleDB.DataReader 检索行

从 SQL Servertable 中的分区中检索数据

如何使用 C# 从 SQL 查询中检索参数