Sql 比较两个具有相同列名但具有聚合的表

Sql 比较两个具有相同列名但具有聚合的表,sql,oracle,join,aggregate,Sql,Oracle,Join,Aggregate,我正在努力做到这一点 TBL 1 PK AK TOT1 TOT2 1 1 100 100 2 2 200 200 TBL 2 PK AK TOT1 TOT2 1 1 50 50 2 1 50 50 3 2 100 100 4 2 50 50 我的主表是TBL1,与AK相连 首先,我需要对所有TBL2的AK求和,然后

我正在努力做到这一点

TBL 1  
PK   AK   TOT1   TOT2  
1    1    100    100  
2    2    200    200


TBL 2  
PK   AK   TOT1   TOT2  
1    1     50     50  
2    1     50     50  
3    2     100    100  
4    2     50     50
我的主表是TBL1,与AK相连 首先,我需要对所有TBL2的AK求和,然后将其与 TBL1

即。 TBL1.AK1.TOT1=100==TBL2.AK1.sumTOT1=100 哪个是正确的 TBL1.AK2.TOT2=200==TBL2.AK2.sumTOT2=150 这是错误的

我需要返回不相等的列

Return TBL  
PK   AK   TBL1.TOT1   TBL2.TOT2  
2    2     200         150 

--Assumed that TBL2 is already totaled.
我已经试过了:

Select AK, SUM(t1.TOT1), SUM(t2.TOT2)  
FROM TBL1 t1  
JOIN TBL2 t2  
ON t1.AK = t2.AK  
GROUP BY t1.AK  
WHERE t1.TOT1 IS NOT t2.TOT2 ....
它返回t1.AK,并将t2.TOT1和t2.TOT2相加 但不是t1.TOT1和t1.TOT2

更新: 我现在已经试过了 选择t1.AK、sumt2.TOT1 从TBL1到t1 加入TBL t2 关于t1.AK=t2.AK t1.AK分组 有t1.TOT1总和2.TOT1

它还我
97900000-在执行联接之前,不是按表达式聚合的分组:

Select t1.AK, t1.TOT1, t2.TOT2
FROM TBL1 t1 LEFT JOIN
     (SELECT ak, SUM(TOT2) as TOT2
      FROM TBL2 t2  
      GROUP BY ak
     ) t2
     ON t1.AK = t2.AK
WHERE t1.TOT1 <> t2.TOT2 OR t2.TOT2 IS NULL;

编辑:添加t2。最后一行删除列歧义

您使用的是mysql还是Oracle?请改正你的错误tags@hawk,对不起,先生。我正在使用Oracle。我不小心点击了Edd mysqlI,我有一个跟进。在我的TBL1上,我有一些TBL2.AK上不存在的AK。我也需要展示它们。是我干的。[完全外部联接]和[其中t1.TOT=NULL];但是没有运气。@MaCheeNeraid。这涉及到一个左连接和一些额外的比较逻辑。
 WITH table1 AS (SELECT 1 AS ak, 100 AS tot1, 100 AS tot2 FROM dual UNION ALL
                   SELECT 2 AS ak, 200 AS tot1, 200 AS tot2 FROM dual  ),
         table2 AS (SELECT 1 AS ak, 50 AS tot1, 50 AS tot2 FROM dual UNION ALL
                  SELECT 1 AS ak, 50 AS tot1, 50 AS tot2 FROM dual UNION ALL
                  SELECT 2 AS ak, 100 AS tot1, 100 AS tot2 FROM dual UNION ALL
                  SELECT 2 AS ak, 50 AS tot1, 50 AS tot2 FROM dual )


SELECT table1.ak, table1.tot1, z.tot1 
FROM table1 JOIN
(SELECT table2.ak ak, sum(table2.tot1) tot1, sum(table2.tot2) tot2
FROM table2
GROUP By table2.ak) z ON table1.ak = z.ak
WHERE   table1.tot1 <> z.tot1 
 AND    table1.tot2 <> z.tot2;