2016-05-29 163 views
0

我有这两个表:两个表的SQL总和

我需要加入付款表与折扣表。由于折扣表没有付款日期,预计的输出似乎不可能。我只能得到net_amount

payment table: 
id | net_amount | payment_dt | person_id 
1001 | 2765.36  | 2016-05-28 | 372 
1002 | 2474.76  | 2016-05-29 | 372 
1003 | 22694.25 | 2016-05-29 | 384 
1004 | 1911.92  | 2016-05-29 | 384 

discounts table: 
id | person_id | gross_amount | sc_discount | other_discount_amount | other_discount_type 
1 | 372  | 3566.7  | 713.34  | 88.00     | MISC 
2 | 372  | 3202.2  | 640.44  | 87.00     | PAT 
3 | 384  | 3566.7  | 713.34  | 285.34    | MISC 
4 | 384  | 27953.10  | 5590.62  | 2236.25    | PAT 
5 | 384  | 2655.45  | 531.09  | 212.44    | MISC 

*1 - payment_dt is 2016-05-28 

expected output: (where payment_dt=2016-05-29) 
total_gross_amount | total_sc_discount | total_misc_discount | total_pat_discount | total_net_amount 
37,377.45   | 7475.49   | 497.78    | 2,323.25   | 27,080.93 
+0

如果两个表的记录之间没有逻辑联系,则无法获得预期的结果。如果你可以指出,每天只有一个记录在dicount表中,并且这些日子还在继续......这意味着今天的折扣是最高的ID昨天是higestid减1 ,,,那么我们可以工作......但这是非常如果例如某一天缺失并打破该顺序,那么特定案例和非常危险。 – SMW

+0

您能否更详细地解释您的模式: Q1:为什么付款表中的“id”重复? Q2:为什么有4个支付条目,但5个折扣条目,它应该是1-1映射? Q3:是net_amount = gross_amount - sc_discount - other_discount_amount? – greperror

+0

这两张表之间可能有***关系。折扣1的'3566.70 - 713.34 - 88.00 = 2765.36'与支付表中的第一行相匹配。折扣2和折扣5的作品一样。然而,折扣3没有匹配的付款行。折扣4 *出现*与最大付款有关,但数字不相加。您似乎缺少一个*整个表格(或表格)*以将付款链接到折扣,或者至少是一些重要的字段。 – MatBailie

回答

0

正如我在这两个表中看到的普通列是person_id,你可以尝试加入它。有关更多信息,您可以记住自然连接,请在Internet上阅读它;)

“NATURAL JOIN是JOIN操作,它根据两个表中的公共列为您创建隐式连接子句一个NATURAL JOIN可以是一个INNER连接,一个LEFT OUTER连接或一个RIGHT OUTER连接,默认是INNER连接。“

+0

这两个表包含相同列的事实并不意味着您可以将它们链接到已删除的输出。作为客户,您可以在很多天内进行多次采购。您如何知道购买A是否与折扣X或折扣Y相关联?只有客户最多只能购买一件商品,您的逻辑才有效。 – SMW

+0

客户可能会有很多购买,但通过表格上的数据我们发现它们之间的唯一链接是perosn_id,我们获得了我们需要的一切,每种付款的折扣金额,折扣类型和付款日期。因为问题我只付款:payment_dt是2016-05-28 – fstafai

+0

@fstafai根据OP给出的数据...'person_id' 372有两笔支付记录。在“2016-05-28”和“2016-05-29”中。他还有两个折扣记录。你怎么知道哪个折扣与哪个订单相关? – Elad

0

通过假设: net_amount = gross_amount - sc_discount - other_discount_amount

您不需要在期望的输出中转到total_net_amount的付款表

你可以写这样的:

Select sum(gross_amount) as total_gross_amount, 
sum(sc_discount) as total_sc_discount, 
sum(gross_amount - sc_discount - other_discount_amount) as total_net_amount 
sum(CASE other_discount_type when 'MISC' THEN other_discount_amount WHEN 'PAT' THEN 0) as total_misc_discount, 
sum(CASE other_discount_type when 'MISC' THEN 0 WHEN 'PAT' THEN other_discount_amount) as total_pat_discount  
from discounts 

而如果上述假设是不正确的,因为聚合是完整的,只有1行会在输出时,你可以得到除了total_net_amount所有列在在上面的查询中,从支付表中获得sum(net_amount),并将它们作为仅1,1行的真实联接。