Sql 如何同时显示两个表中记录不匹配的所有记录?

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),

我想显示两个表中的所有值([JC_ItemDSP10days]、[JC_ItemDSP30Days])

当我运行下面的查询时,它返回14210行

当我运行此查询时,它返回16455行

现在我想显示两个表中的所有记录,当JC_ItemDSP10days.ItemID=JC_ItemDSP30Days.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);