【问题标题】:Joining data that exists in two tables and aggregating non joined data连接两个表中存在的数据并聚合未连接的数据
【发布时间】:2013-09-11 07:06:41
【问题描述】:

我有两张桌子

Name    | ID      | 
--------+---------+
A       | 3       | 
A       | 5       | 
B       | 1       | 



 ID     | Count   | 
--------+---------+
1       | 10      | 
2       | 50      | 
3       | 15      | 
6       | 20      | 

我想生成一些东西来连接这两个表的 ID 以及聚合不匹配条目的结果

Name    | ID      | Count
--------+---------+----------
A       | 3       | 15
A       | 5       | 0 *//(doesn't exists)*
A       | others  | 80 *//(10 (ID 1) + 50 (ID 2) + 20 (ID 6))*
B       | 1       | 10
B       | others  | 85 *//(50 (ID 2) + 15 (ID 3) + 20 (ID 6))*

到目前为止,我可以获取匹配的项目,但无法获取不匹配的聚合。

我觉得在每个 ID 列表上执行 except 并聚合不匹配的 ID 并不是一个优雅的解决方案。

希望找到更优雅的解决方案。

编辑: 我忘了提到我正在使用SQL server。 oracle 解决方案在我的场景中没有任何用处,但会在类似的场景中为 Oracle 用户提供帮助。

【问题讨论】:

  • 在 oracle 和 sql server 的情况下,您可以使用完全外连接来完成。如果是 mysql left join union right join 就可以了。你用的是什么 dbms。
  • @Mani 我不认为这对于单个查询是可行的,他的部分结果需要汇总,而其他部分 - 不汇总。
  • @SvetoslavTsolov。看来他需要对整个结果进行分组。不偏。 sum(count) 按名称分组,id。其中 name 和 id 基于 join 合并

标签: asp.net sql-server linq linq-to-sql join


【解决方案1】:

这个怎么样: 获取匹配的项目并与第二个查询进行联合。 第二个查询将选择名称、'others'、sum(count) 并根据名称进行分组,其中 id 不在第一个表的 id 中(您可以使用子查询进行检查)。

如果你愿意,我可以打出来,你看起来很清楚自己在做什么,只需要大致了解如何去做。

【讨论】:

    【解决方案2】:

    LINQ 解决方案是这样的:

    from n in Names
    join c in Counts on n.ID equals c.ID into outer
    select new { n.Name, 
                 ID = outer.Count() > 1 ? "others" : n.ID.ToString(),
                 Sum = ((int?)outer.Sum(x => x.Count)) ?? 0 }
    

    它相当于外连接,但也有一些技巧将null 转换为0。在 linq-to-sql 中,这很好地转换为 SQL。并且因为被翻译成SQLouter.Count()不会在outernull时抛出异常。

    【讨论】:

    • 不幸的是,这只能得到匹配的结果。我不认为这是在做外部连接。
    • @user2427375 你确定吗? join ... into 相当于GroupJoin(),相当于外连接。在一个类似的查询中,我得到了所有“名称”的结果,包括那些没有“计数”的结果。
    【解决方案3】:

    如果是 oracle,请使用 nvl。 sql server ifnull() 和 mysql isnull() 与左右外联合而不是全外联合

    select name, id, sum(cnt) from
    (
    select name, nvl(to_char(a.id), 'others') id, nvl(b.count,0) cnt 
    from table1 a 
         full outer join 
         table2 b on a.id = b.id)
    group by name, id
    

    【讨论】:

      猜你喜欢
      • 2014-03-23
      • 1970-01-01
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      • 2021-11-13
      • 1970-01-01
      相关资源
      最近更新 更多