【问题标题】:Sum up invoice amounts based upon IDs that exist in multiple columns根据多列中存在的 ID 汇总发票金额
【发布时间】:2017-04-12 23:30:00
【问题描述】:

假设我有一个表格,其中包含按行和 6 列的发票行,其中员工 ID 可以标记到该发票。员工 ID 不能在一行中重复,但是相同的员工 ID 可以存在于不同发票行的不同列中。在下表中,REP 1 的总数应为 500。

我希望能够按员工 ID(REP 1、REP 2 等)汇总总金额。我可以使用大型联合查询来做到这一点,但问题是我有一个需要总结的大约 450 个员工 ID 的列表。有没有一种方法可以让一个查询吐出员工 ID 及其总金额的列表?

【问题讨论】:

  • 根据证据(2 个标签对 1 个),我删除了 mysql 标签。如果您的问题与 SQL Server 无关,请适当标记。
  • 首先让我们澄清一下您使用的是哪种产品:MySQL 或 ms sql server。此外,是否可以选择非规范化数据结构并将插槽放在记录中,而不是在列中。
  • 抱歉,我更新了标签。版本是 Microsoft SQL Server。

标签: sql-server


【解决方案1】:

我建议使用cross apply:

select v.e, sum(t.amount)
from t cross apply
     (values (slot1), (slot2), (slot3), (slot4), (slot5), (slot6)) v(e)
group by v.e;

注意:这里假设您使用的是 SQL Server。

【讨论】:

  • 这是否说明了每个插槽中所有潜在的不同值?
【解决方案2】:

加入表格是一种方式......

select e.employee_id,
       sum(i.amount)
  from invoice i,
  join employee e on (e.employee_id in (i.slot1, i.slot2, i.slot3, i.slot4, i.slot5, i.slot6))
 group by e.employee_id;

另一种方法...

select employee_id,
       sum(amount)
from (
    select slot1 employee_id, sum(amount) amount from invoice group by slot1 union
    select slot2, sum(amount) from invoice group by slot2 union all
    select slot3, sum(amount) from invoice group by slot3 union all
    select slot4, sum(amount) from invoice group by slot4 union all
    select slot5, sum(amount) from invoice group by slot5 union all
    select slot6, sum(amount) from invoice group by slot6
) as q1
group by employee_id;

【讨论】:

  • @ RMathis,您的替代查询是否考虑了所有 6 列中的所有 ID,即使您是按第一个插槽中的 employee_id 分组的?
  • yes... 在第一个查询中,连接到员工表允许每个员工获得信用。第二个查询将派生表中每个槽的聚合结果联合起来,然后最后一次将其聚合在一起。第一个查询确定列名,因此所有槽都在employee_id 列中提供标识符,并且所有sum(amounts) 都被赋予名称amount。联合所有是更好的选择 - 我相应地更新了答案。
猜你喜欢
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
相关资源
最近更新 更多