2017-02-23 170 views
0

Я хочу, чтобы показать все значения из обеих таблиц ([JC_ItemDSP10days], [JC_ItemDSP30Days])Как показать все записи из обеих таблиц С непревзойденной записью также?

, когда я запускаю это ниже запрос, он возвращает 14210 Ряды

select 
    itemid,sum(qtysold) [NineDaysSold] 
from 
    [HQMatajer].[dbo].[JC_ItemDSP10days] 
group by ItemID 

, когда я запускаю этот запрос, он возвращает 16455 Строки

select 
    itemid,sum(qtysold) [ThirtyDaysSold] 
from 
    [HQMatajer].[dbo].[JC_ItemDSP30Days] 
group by ItemID 

Теперь я хочу, чтобы показать все записи из таблицы как, когда 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 

Но результат неправильно

Result

Это фактическое значение ItemID = 9 Из первого результата два запроса

Result2

ответ

2

Поскольку вы будете иметь несколько строк для одной и той же itemid в каждой таблице, используя full join вы получите дубликаты в качестве совпадений совпадений, которые будут раздувать ваши агрегаты.

Следовательно, перед объединением результатов вам необходимо выполнить агрегацию в каждом наборе данных. В простейшем виде (с точки зрения видя, что делается), что вам нужно сделать, логически следующее:

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

Что более традиционно делается с использованием Common Table Expressions:

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); 
+0

Благодаря это рабочий брат –