Sql 如何同时显示两个表中记录不匹配的所有记录?
我想显示两个表中的所有值([JC_ItemDSP10days]、[JC_ItemDSP30Days]) 当我运行下面的查询时,它返回14210行 当我运行此查询时,它返回16455行 现在我想显示两个表中的所有记录,当JC_ItemDSP10days.ItemID=JC_ItemDSP30Days.ItemID时,如果记录不在任何一个表中,它也必须显示结果 这就是我试过的Sql 如何同时显示两个表中记录不匹配的所有记录?,sql,sql-server,stored-procedures,aggregate,Sql,Sql Server,Stored Procedures,Aggregate,我想显示两个表中的所有值([JC_ItemDSP10days]、[JC_ItemDSP30Days]) 当我运行下面的查询时,它返回14210行 当我运行此查询时,它返回16455行 现在我想显示两个表中的所有记录,当JC_ItemDSP10days.ItemID=JC_ItemDSP30Days.ItemID时,如果记录不在任何一个表中,它也必须显示结果 这就是我试过的 select ItemID =isnull(nineDays.itemid,thirtyDays.ItemID),
select
ItemID =isnull(nineDays.itemid,thirtyDays.ItemID),
CONVERT(DECIMAL(10,2),sum(nineDays.qtysold)) [NineDaysSold],
CONVERT(DECIMAL(10,2),sum(thirtyDays.qtysold)) [ThirtyDaysSold]
from
[JC_ItemDSP10days] nineDays
FULL outer JOIN [HQMatajer].[dbo].[JC_ItemDSP30Days] thirtyDays on nineDays.ItemID=thirtyDays.ItemID
group by nineDays.ItemID,thirtyDays.ItemID
order by ItemID
但结果是错误的
这是ItemID=9的实际值
从前两个查询结果
因为在每个表中相同的
itemid
都有多行,所以使用完全联接将得到重复的匹配项,因为匹配项重叠会使聚合膨胀
因此,在将结果合并到一起之前,需要对每个数据集进行聚合。以最简单的形式(就观察正在做的事情而言),逻辑上你需要做的是:
select itemid = isnull(nineDays.itemid,thirtyDays.ItemID)
,nineDays.NineDaysSold
,thirtyDays.ThirtyDaysSold
from (select itemid
,sum(qtysold) as NineDaysSold
from [HQMatajer].[dbo].[JC_ItemDSP10days]
group by ItemID
) as nineDays
full outer join (select itemid
,sum(qtysold) as ThirtyDaysSold
from [HQMatajer].[dbo].[JC_ItemDSP30Days]
group by ItemID
) as thirtyDays
on(nineDays.itemid = thirtyDays.itemid);
更传统的做法是使用:
因为每个表中相同的itemid
都有多行,所以使用完全联接
可以得到重复的匹配项,因为匹配项重叠会使聚合膨胀
因此,在将结果合并到一起之前,需要对每个数据集进行聚合。以最简单的形式(就观察正在做的事情而言),逻辑上你需要做的是:
select itemid = isnull(nineDays.itemid,thirtyDays.ItemID)
,nineDays.NineDaysSold
,thirtyDays.ThirtyDaysSold
from (select itemid
,sum(qtysold) as NineDaysSold
from [HQMatajer].[dbo].[JC_ItemDSP10days]
group by ItemID
) as nineDays
full outer join (select itemid
,sum(qtysold) as ThirtyDaysSold
from [HQMatajer].[dbo].[JC_ItemDSP30Days]
group by ItemID
) as thirtyDays
on(nineDays.itemid = thirtyDays.itemid);
更传统的做法是使用:
select itemid = isnull(nineDays.itemid,thirtyDays.ItemID)
,nineDays.NineDaysSold
,thirtyDays.ThirtyDaysSold
from (select itemid
,sum(qtysold) as NineDaysSold
from [HQMatajer].[dbo].[JC_ItemDSP10days]
group by ItemID
) as nineDays
full outer join (select itemid
,sum(qtysold) as ThirtyDaysSold
from [HQMatajer].[dbo].[JC_ItemDSP30Days]
group by ItemID
) as thirtyDays
on(nineDays.itemid = thirtyDays.itemid);
with nineDays as
(
select itemid
,sum(qtysold) as NineDaysSold
from [HQMatajer].[dbo].[JC_ItemDSP10days]
group by ItemID
), thirtyDays as
(
select itemid
,sum(qtysold) as ThirtyDaysSold
from [HQMatajer].[dbo].[JC_ItemDSP30Days]
group by ItemID
)
select itemid = isnull(nineDays.itemid,thirtyDays.ItemID)
,nineDays.NineDaysSold
,thirtyDays.ThirtyDaysSold
from nineDays
full outer join thirtyDays
on(nineDays.itemid = thirtyDays.itemid);