给出了很多折扣后的产品最终价格

ere*_*ale 13 sql sql-server discount price

我有两张桌子.一张Ids及其价格表,以及每张Id的第二张折扣表.在折扣表中,Id可以有很多折扣,我需要知道Id的最终价格.

查询它的最佳方式是什么(在一个查询中)?对于每个id的许多折扣,查询应该是通用的(不仅如下面的例子中提到的那样)

例如表一

id  price   
1   2.00   
2   2.00   
3   2.00   
Run Code Online (Sandbox Code Playgroud)

表二

id  Discount   
1   0.20   
1   0.30   
2   0.40   
3   0.50   
3   0.60   
Run Code Online (Sandbox Code Playgroud)

最后结果:

id  OrigPrice   PriceAfterDiscount  
1   2.00        1.12     
2   2.00        1.20      
3   2.00        0.40      
Run Code Online (Sandbox Code Playgroud)

Phi*_*pXT 10

这是另一种方法:

SELECT T1.ID, T1.Price, T1.Price * EXP(SUM(LOG(1 - T2.Discount)))
FROM T1 INNER JOIN T2 ON T1.ID = T2.ID
GROUP BY T1.ID, T1.Price
Run Code Online (Sandbox Code Playgroud)

EXP/LOG技巧只是另一种做乘法的方法.

如果T1中的条目没有T2的折扣,您可以将INNER JOIN更改为LEFT JOIN.你最终会得到以下结果:

ID   Price   Discount
4    2.00    NULL
Run Code Online (Sandbox Code Playgroud)

您的逻辑可以在折扣价格列中考虑空值并取代原始价格,或者只为这些添加0折扣记录.


Gio*_*uri 5

通常它可以通过LOG/EXP功能技巧来完成,但它很复杂。这是一个基本示例:

declare @p table(id int, price money)
declare @d table(id int, discount money)

insert into @p values
(1, 2),
(2, 2),
(3, 2)

insert into @d values
(1, 0.2),
(1, 0.3),
(2, 0.4),
(3, 0.5),
(3, 0.6)


select p.id, 
       p.price, 
       p.price * ca.discount as PriceAfterDiscount  
from @p p
cross apply (select EXP(SUM(LOG(1 - discount))) as discount FROM @d where id = p.id) ca
Run Code Online (Sandbox Code Playgroud)

对于更简单的(基于光标的方法),您将需要一个 recursive CTE,但在这种情况下,您需要Discounts表中的一些唯一排序列才能正确运行它。这显示在@Tanner 的回答中。

最后你可以用一个普通的光标来解决这个问题