SQL Server 2012: левое объединение нескольких операторов выбора - PullRequest
0 голосов
/ 05 июля 2018

Мне нужно найти торговые точки, которые работали в мае или перестали работать в июне.

У меня есть запрос SQL вроде:

select * 
from
    (select a.OL_id [Kod], d.Year, d.Month, OLRegion_name, OLDistrict_name, OLCntArea_name, OLCity_name, a.RM_name, a.DSM_Name, a.Supervisor_name, a.MerchName, SUM(s.SaleDal) [Sales]
    from DW_Cube_Area a
    join DW_Cube_Fact_Sale s on a.Area_Id=s.Area_Id
    join DW_Cube_Time d on d.Date_Id=s.Date_Id
    join DW_Cube_SKU p on s.SKU_Id=p.SKU_Id
    where d.Date between '20180501' and '20180531'
    and a.StartDate between '20180501' and '20180531'
    and a.PID=0 and s.PID=0
    and p.ProdGroupName Not Like 'Напої'
    and p.UnitName  Like 'кег'
    group by  d.Year, d.Month, a.OL_id, a.RM_name, a.DSM_Name, a.Supervisor_name, a.MerchName, OLRegion_name, OLDistrict_name, OLCntArea_name, OLCity_name
    having ABS(SUM(s.SaleDal))>0.1) tb1
left join
    (select a.OL_id [Kod], d.Year, d.Month, OLRegion_name, OLDistrict_name, OLCntArea_name, OLCity_name, a.RM_name, a.DSM_Name, a.Supervisor_name, a.MerchName, SUM(s.SaleDal) [Sales]
    from DW_Cube_Area a
    join DW_Cube_Fact_Sale s on a.Area_Id=s.Area_Id
    join DW_Cube_Time d on d.Date_Id=s.Date_Id
    join DW_Cube_SKU p on s.SKU_Id=p.SKU_Id
    where d.Date between '20180601' and '20180630'
    and a.StartDate between '20180601' and '20180630'
    and a.PID=0 and s.PID=0
    and p.ProdGroupName Not Like 'Напої'
    and p.UnitName  Like 'кег'
    group by  d.Year, d.Month, a.OL_id, a.RM_name, a.DSM_Name, a.Supervisor_name, a.MerchName, OLRegion_name, OLDistrict_name, OLCntArea_name, OLCity_name
    having ABS(SUM(s.SaleDal))>0.1) tb2
on 
    t1.Kod = t2.Kod
where 
    t2.Kod is null

Когда я выполняю этот запрос, результат ошибки:

Не удалось связать многокомпонентный идентификатор "t1.Kod".

Не удалось связать многоэлементный идентификатор "t2.Kod".

Почему?

Если я разделю запрос на 2 отдельных запроса, он будет работать нормально.

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

псевдонимы должны быть tb1 / tb2, а не t1 / t2

on 
    tb1.Kod = tb2.Kod
where 
    tb2.Kod is null

Теперь все работает.

0 голосов
/ 05 июля 2018

Я думаю, что вы можете делать то, что хотите, проще с помощью условного агрегирования:

select a.OL_id [Kod], d.Year, d.Month, OLRegion_name, OLDistrict_name, OLCntArea_name, OLCity_name, a.RM_name, a.DSM_Name, a.Supervisor_name, a.MerchName,
       sum(case when d.Date between '20180501' and '20180531' and a.StartDate between '20180501' and '20180531'
                then s.SaleDal else 0
           end) as sales_201805,
       sum(case when d.Date between '20180601' and '20180630' and a.StartDate between '20180601' and '20180630'
                then s.SaleDal else 0
           end) as sales_201806
from DW_Cube_Area a join
     DW_Cube_Fact_Sale s
     on a.Area_Id = s.Area_Id join
     DW_Cube_Time d
     on d.Date_Id = s.Date_Id join
     DW_Cube_SKU p
     on s.SKU_Id = p.SKU_Id
where a.PID = 0 and s.PID = 0 and
      p.ProdGroupName Not Like 'Напої' and
     p.UnitName  Like 'кег'
group by d.Year, d.Month, a.OL_id, a.RM_name, a.DSM_Name, a.Supervisor_name, a.MerchName, OLRegion_name, OLDistrict_name, OLCntArea_name, OLCity_name;
...