2017-09-14 38 views
0

我想弄明白在特定情况下的group by子句:我加入了两张应该有相同的美元金额为每张发票,所以我试图作出查询以确认没有差异。这里是表,查询和结果:缺少数据与群和和

Table A: 
Order_Number | Order_Number_Line | Amount 
1   | 1     | 80 
1   | 2     | 20 
1   | 3     | 30 
1   | 4     | 70 

Table B 

Order_Number | Order_Number_Line | Invoice_ID | Invoice_Line_Number | Amount 
1   | 1     | 1234  | 1     | 20 
1   | 2     | 1234  | 2     | 5 
1   | 3     | 1234  | 3     | 10 
1   | 4     | 1234  | 4     | 25 
1   | 1     | 1234  | 1     | 35 
1   | 2     | 1234  | 2     | 7 
1   | 3     | 1234  | 3     | 15 
1   | 4     | 1234  | 4     | 10 
1   | 1     | 1234  | 1     | 25 
1   | 2     | 1234  | 2     | 8 
1   | 3     | 1234  | 3     | 5 
1   | 4     | 1234  | 4     | 35 

Select A.Order_Number, A.Amount, B.Amount 
From Table_A as A 
Left Join (Select Order_Number, Amount From Table_B) as B 
On A.Order_Number = B.Order_Number 

Order_Number | Amount_Table_A | Amount_Table_B 
01   | 80    | 20    
01   | 80    | 5    
01   | 80    | 10    
01   | 80    | 25    
01   | 80    | 35    
01   | 80    | 7    
01   | 80    | 15   
01   | 80    | 10   
01   | 80    | 25    
01   | 80    | 8   
01   | 80    | 5   
01   | 80    | 35 
01   | 20    | 20    
01   | 20    | 5    
01   | 20    | 10    
01   | 20    | 25    
01   | 20    | 35    
01   | 20    | 7    
01   | 20    | 15   
01   | 20    | 10   
01   | 20    | 25    
01   | 20    | 8   
01   | 20    | 5   
01   | 20    | 35 
01   | 30    | 20    
01   | 30    | 5    
01   | 30    | 10    
01   | 30    | 25    
01   | 30    | 35    
01   | 30    | 7    
01   | 30    | 15   
01   | 30    | 10   
01   | 30    | 25    
01   | 30    | 8   
01   | 30    | 5   
01   | 30    | 35 
01   | 70    | 20    
01   | 70    | 5    
01   | 70    | 10    
01   | 70    | 25    
01   | 70    | 35    
01   | 70    | 7    
01   | 70    | 15   
01   | 70    | 10   
01   | 70    | 25    
01   | 70    | 8   
01   | 70    | 5   
01   | 70    | 35    

我试着用分组,但是只得到了每个表的第一个量的记录:

Select A.Order_Number, A.Amount, B.Amount 
From Table_A as A 
Left Join (Select Order_Number, Amount From Table_B) as B 
On A.Order_Number = B.Order_Number 
Group By A.Order_Number 

Invoice_ID | Amount_Table_A | Amount_Table_B | 
01   | 80    | 20    | 

我尝试添加的总和()子句每个量在SELECT语句的属性,得到了各重复记录的总和:

Select A.Order_Number, sum(A.Amount), sum(B.Amount) 
From Table_A as A 
Left Join (Select Order_Number, Amount From Table_B) as B 
On A.Order_Number = B.Order_Number 
Group By A.Order_Number 

Invoice_ID | Amount_Table_A | Amount_Table_B | 
01   | 2400   | 800    | 

请问有什么可以修改此查询,以显示真正的价值?预期值为:

Invoice_ID | Amount_Table_A | Amount_Table_B | 
01   | 200    | 200    | 

请注意,这是一个过于简化的数据集。真正的表有超过一百万条记录,我需要确保Invoice_ID在两个表中总计相同。

非常感谢你!

+0

您能否请您发布表A和表B中的第一个10-20条记录,以及您需要的10-20条记录计算所需的输出。这将有助于更好地了解你需要什么。 –

+0

我刚刚编辑了问题,以便您可以访问数据集。期望的输出是每个表的期望值:200。 –

回答

1

试试这个,让我知道这是否适合你。

SELECT 
    A.Order_Number, A.Amount AS A_Amount, B.Amount AS B_Amount 
FROM 
    (SELECT 
     Order_Number, SUM(Amount) AS Amount 
    FROM 
     A 
    GROUP BY Order_Number) A 
     JOIN 
    (SELECT 
     Order_Number, SUM(Amount) AS Amount 
    FROM 
     B 
    GROUP BY Order_Number) B ON A.Order_Number = B.Order_Number 
+0

它工作了!是否有推荐的文献来理解查询的工作方式?我从来没有这样建立过 –

1

你很近,试试这个。这并不是100%清楚你想要做什么,但我希望这有助于。看起来你在加入时没有足够的选择性。

Select A.Order_Number, SUM(A.Amount), SUM(B.Amount) 
From Table_A as A 
Left Join Table_B as B 
On A.Order_Number = B.Order_Number AND A.Order_Line_Number = B.Order_Line_Number 
Group By A.Order_Number 
+0

这几乎成功!我正在编辑问题并添加您的修复程序。 B.Amount出来了,但A.Amount出来的3X是正确的A.Amount。 我的目标是运行一个查询,它将为我的所有Order_Numbers显示A.Amount和B.Amount。在这个例子中,我只使用了1个订单号,但我有数千个订单号。我想确保表A和B中的数量是同步的。 –