【问题标题】:SQL to join two queries and sum like recordsSQL 连接两个查询并对类似记录求和
【发布时间】:2018-09-19 07:03:21
【问题描述】:

我正在使用 asp.net 编写 Web 表单页面。我有两张不同的桌子。两个表都有相同的列,只是数据不同。例如:

Table 1: col1,  col2,  col3
         123   $12.54   Tom
          34   $7.00    Jan

Table 2: col1,  col2,  col3
         123   $125.00  Tom
         56    $12.00   Joe

我正在尝试编写一个将两个表组合在一起的 sql 语句,如果表 1 中的 Col1 与表 2 中的 col1 相同,我想将第 2 列的值相加。例如:

Col1     col2     col3
123      $137.54    Tom
34       $7.00      Jan
56       $12.00     Joe

这里是 sql 查询:

表1:

SELECT ABAN8 as Number, SUM(SDAEXP * .01) as SaleAmount, A5POPN as Rep 
FROM KAIPRDDTA.F0101, KAIPRDDTA.F4211, KAIPRDDTA.F0301 
WHERE A5AN8 = ABAN8 
 AND ABAN8 = SDAN8 
 AND SDKCOO = '00001' 
 AND SDDCTO not like '%2' 
 AND A5DAOJ >= '118069' 
 AND A5DAOJ <= '118099' 
 GROUP BY ABALPH, A5POPN, ABAN8, A5UPMT, A5CMC1

表2:

SELECT ABAN8 as Number, SUM(SDAEXP * .01) as SaleAmount, A5POPN as Rep 
FROM KAIPRDDTA.F0101, KAIPRDDTA.F42119, KAIPRDDTA.F0301 
WHERE A5AN8 = ABAN8 
 AND ABAN8 = SDAN8 
 AND SDKCOO = '00001' 
 AND SDDCTO not like '%2' 
 AND A5DAOJ >= '118069' 
 AND A5DAOJ <= '118099' 
 GROUP BY ABALPH, A5POPN, ABAN8, A5UPMT, A5CMC1

我知道连接语法已经过时,但这就是这家公司使用它的方式。如果您需要更多信息,请告诉我,并提前感谢您的回复!

【问题讨论】:

  • 您的数据样本和您的代码似乎不相关..
  • (1) 您提到两个表,但您的查询有三个。 (2) 标记您正在使用的数据库。 (3) 在正确使用数据库的公司找到工作。
  • 我是 Gordon 的第三部分。隐式连接不仅过时了,而且已经过时了超过 25 年(!)。
  • 另外,列名是怎么回事?你工作的公司是否停留在 1985 年,因为内存太贵,一切都被缩短到最低限度?正是这种精神导致了对 y2k 错误的大规模歇斯底里……你真的,真的应该找一家更好的公司工作。
  • 佐哈尔,你为什么不尝试帮助而不是担心我们都无法控制的事情

标签: sql asp.net vb.net db2


【解决方案1】:

好吧,使用合并和完全外连接基本上相当容易,虽然我不知道 db2 是否支持隐式完全外连接。

我将讨论您发布的示例数据,而不是查询,因为我喜欢能够阅读我正在写的内容,并且因为我觉得对于要阅读的每个人来说都会更加清晰这 - 所以这里是:

SELECT COALESCE(t1.col1, t2.col1) As col1, 
       COALESCE(t1.col2, 0) +  COALESCE(t2.col2, 0) As col2, 
       COALESCE(t1.col3, t2.col3) As col3
FROM table1 as t1
FULL JOIN table12 as t2 ON t1.col1 = t2.col1

据我了解,DB2 supports implicit left joins and implicit right joins。我找不到关于完全加入的任何信息,但我想它应该像这样工作:

FROM table1 as t1, table2 as t2
WHERE t1.col1(+) = t2.col1(+)

【讨论】:

  • 我使用的是 COALESCE,但没有考虑拆分销售额并将它们加在一起。这对我有用,谢谢!
  • 很高兴为您提供帮助 :-) 再次抱歉,如果我在这个问题上的问题似乎冒犯了您,那不是我的意图。
  • 您引用的文档表明显式外连接语法是首选,并且您应该只在从另一个 RDBMS 查询时必须使用外连接语法。
  • @jmarkmurphy 我完全赞成到处明确加入。 OP 在一家强制执行隐式连接的公司工作。您可以在问题的 cmets 中了解它。
【解决方案2】:

在“分组依据”的 5 列中,仅选择了 2 列。对于给定的数字和代表,您可能会获得多条记录。检查“UNION ALL”是否符合您的要求。

Select number, sum(SaleAmount) , Rep
from
( SELECT ABAN8 as Number, (SDAEXP * .01) as SaleAmount, A5POPN as Rep 
FROM KAIPRDDTA.F0101, KAIPRDDTA.F4211, KAIPRDDTA.F0301 
WHERE A5AN8 = ABAN8 
 AND ABAN8 = SDAN8 
 AND SDKCOO = '00001' 
 AND SDDCTO not like '%2' 
 AND A5DAOJ >= '118069' 
 AND A5DAOJ <= '118099' 
union all
SELECT ABAN8 as Number,  (SDAEXP * .01) as SaleAmount, A5POPN as Rep 
FROM KAIPRDDTA.F0101, KAIPRDDTA.F42119, KAIPRDDTA.F0301 
WHERE A5AN8 = ABAN8 
 AND ABAN8 = SDAN8 
 AND SDKCOO = '00001' 
 AND SDDCTO not like '%2' 
 AND A5DAOJ >= '118069' 
 AND A5DAOJ <= '118099' 
) a 
group by number , rep 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 2016-12-05
    • 2023-03-12
    • 1970-01-01
    • 2022-01-12
    • 2016-05-27
    相关资源
    最近更新 更多