Sql 一对多与两个表中的和联接;如何处理副本?

Sql 一对多与两个表中的和联接;如何处理副本?,sql,sql-server,one-to-many,Sql,Sql Server,One To Many,我有下面的场景- 商品销售: ╔═════╦════════╦════════════╗ ║ SKU ║ ItemId ║ SaleAmount ║ ╠═════╬════════╬════════════╣ ║ 123 ║ 1 ║ $45.99 ║ ║ 456 ║ 2 ║ $54.99 ║ ╚═════╩════════╩════════════╝ 优惠券: ╔═════╦══════════╦═══

我有下面的场景-

商品销售:

    ╔═════╦════════╦════════════╗
    ║ SKU ║ ItemId ║ SaleAmount ║
    ╠═════╬════════╬════════════╣
    ║ 123 ║      1 ║ $45.99     ║
    ║ 456 ║      2 ║ $54.99     ║
    ╚═════╩════════╩════════════╝
优惠券:

    ╔═════╦══════════╦══════════════╗
    ║ SKU ║ CouponId ║ CouponAmount ║
    ╠═════╬══════════╬══════════════╣
    ║ 123 ║        1 ║ $4           ║
    ║ 123 ║        2 ║ $5           ║
    ║ 123 ║        3 ║ $2           ║
    ║ 456 ║        1 ║ $2           ║
    ╚═════╩══════════╩══════════════╝
期望的最终结果

    ╔═════╦════════════╦══════════════╗
    ║ SKU ║ SaleAmount ║ CouponAmount ║
    ╠═════╬════════════╬══════════════╣
    ║ 123 ║ $45.99     ║ $11          ║
    ║ 456 ║ $54.99     ║ $2           ║
    ╚═════╩════════════╩══════════════╝
通过将过滤后的
商品销售
查询加入过滤后的
销售优惠券
查询并按
sku
进行分组,我已经具备了这一功能,但是我想知道是否有更好的方法来做到这一点,不会导致
销售优惠券
中的每个记录都重复
销售金额
。i、 e.如果您只需对
销售优惠券
SUM(SaleAmount)、SUM(CouponAmount)
按SKU分组
,您将得到-

    ╔═════╦════════════╦══════════════╗
    ║ SKU ║ SaleAmount ║ CouponAmount ║
    ╠═════╬════════════╬══════════════╣
    ║ 123 ║ $137.97    ║ $11          ║
    ║ 456 ║ $54.99     ║ $2           ║
    ╚═════╩════════════╩══════════════╝

这对于
sku=456
来说是正确的,但是当有多个相应的
销售优惠券记录时,它会崩溃。

您可以这样做:

;with item_sales as (
select 
123 as sku
,1 as itemid
,45.99 as salesamount

union all

select 
456 as sku
,2 as itemid
, 54.99 as salesamount
)
Select item_sales.* into #itemsales from item_sales


;with mycte as (
select 
123 as sku
,1 as couponid
,4 as couponamount

union all

select 
123 as sku
,2 as couponid
,5 as couponamount
union all

select 
123 as sku
,3 as couponid
,2 as couponamount
union all

select 
456 as sku
,1 as couponid
,2 as couponamount
)

Select
 mycte.sku
 ,ist.salesamount
 ,sum(couponamount )  as couponamount 
from mycte

inner join #itemsales  ist
    on  ist.sku = mycte.sku
group by 
 mycte.sku
 ,ist.salesamount

 drop table #itemsales

您可以这样做:

;with item_sales as (
select 
123 as sku
,1 as itemid
,45.99 as salesamount

union all

select 
456 as sku
,2 as itemid
, 54.99 as salesamount
)
Select item_sales.* into #itemsales from item_sales


;with mycte as (
select 
123 as sku
,1 as couponid
,4 as couponamount

union all

select 
123 as sku
,2 as couponid
,5 as couponamount
union all

select 
123 as sku
,3 as couponid
,2 as couponamount
union all

select 
456 as sku
,1 as couponid
,2 as couponamount
)

Select
 mycte.sku
 ,ist.salesamount
 ,sum(couponamount )  as couponamount 
from mycte

inner join #itemsales  ist
    on  ist.sku = mycte.sku
group by 
 mycte.sku
 ,ist.salesamount

 drop table #itemsales

这对你有帮助。您需要根据SKU和SaleAmuty进行分组


这对你有帮助。您需要根据SKU和SaleAmuty进行分组

试试这个:

WITH S AS 
(
   SELECT SKU, SUM(SaleAmount) AS SaleAmount
   FROM Sales
   GROUP BY SKU
), 
C AS 
(
   SELECT SKU, SUM(CouponAmount) AS CouponAmount
   FROM Coupons
   GROUP BY SKU
)
SELECT ISNULL(S.SKU, C.SKU) AS SKU, S.SaleAmount, C.CouponAmount
FROM S FULL OUTER JOIN C ON S.SKU = C.SKU
试试这个:

WITH S AS 
(
   SELECT SKU, SUM(SaleAmount) AS SaleAmount
   FROM Sales
   GROUP BY SKU
), 
C AS 
(
   SELECT SKU, SUM(CouponAmount) AS CouponAmount
   FROM Coupons
   GROUP BY SKU
)
SELECT ISNULL(S.SKU, C.SKU) AS SKU, S.SaleAmount, C.CouponAmount
FROM S FULL OUTER JOIN C ON S.SKU = C.SKU

您使用哪个数据库?Orable、Mysql等?请将其添加到tag.sql server 2012预先汇总
优惠券
,这样它是一对一的,然后加入。您可以使用子表进行预汇总。扩展上述注释,一种方法是使用子查询,从优惠券表(按SKU分组)中选择SKU和优惠券金额之和,然后将其连接到您的项目表。请查找我发布的答案。您使用哪个数据库?Orable、Mysql等?请将其添加到tag.sql server 2012预先汇总
优惠券
,这样它是一对一的,然后加入。您可以使用子表进行预汇总。扩展上述注释,一种方法是使用子查询,从优惠券表(按SKU分组)中选择SKU和优惠券金额之和,然后将其连接到您的项目表。请查找我发布的答案。无需预汇总项目表,这将做完全相同的事情-双重计数!对不起,我确实试过了,但除非你编辑它,否则它不会让我这么做。我取消了我的否决票-很抱歉误解了。我不觉得这比任何其他答案都好。让我们来吧。在不预先总结项目表的情况下,这将做完全相同的事情-重复计算!对不起,我确实试过了,但除非你编辑它,否则它不会让我这么做。我取消了我的否决票-很抱歉误解了。不过,我不觉得这比任何其他答案都好。让我们一起来吧。