SQL - где "в" и "не в" из одного столбца в 2 новых столбца

Я работал над отчетом и не могу использовать @variable. Поэтому я пытаюсь решить мою проблему с помощью "простого" SQL.

У меня проблема в том, что у меня есть одна таблица (DEPTH) содержащий все места на складе. Но эта таблица не показывает, занято ли место или нет. Чтобы узнать, мне нужно использовать "где в" или "где не в" в таблице (PRODUCTLOCATION)

Я хотел бы иметь это как один выход вместо выполнения 2 запросов. С UNION Я получаю то, что хочу, но формат неправильный.

Таким образом, результат LoationCount должен быть там, где существует в 1 столбце, а где нет в другом столбце.

Я перепробовал так много вещей. Как видите, я хочу, чтобы это сгруппировалось по EquipmentType и так далее.

Вот мой сценарий, как сейчас.

select EquipmentType, EquipmentName, LocationName, LocationCount, Used_Or_UnUsed,  LocationID, LocationType
from 
    (select et.equiptext EquipmentType, 
    e.EQUIPTEXT EquipmentName,
    s.SIZETEXT LocationName, count(*) LocationCount, 'Empty Locations' as Used_Or_UnUsed, s.sizeid LocationID ,
    case when d.LOCATIONTYPE=1 then 'Pick Location' when d.LOCATIONTYPE=2 then 'Buffer Location' else 'Unknown' end as LocationType 
    from depth d with (nolock)
    join SIZEPARAM s with (nolock) on d.SIZEID=s.SIZEID
    join POSITIONS p with (nolock) on d.POSITIONID=p.POSITIONID
    join shelf sh with (nolock) on p.SHELFID=sh.SHELFID
    join EQUIPMENT e with (nolock) on sh.EQUIPID=e.EQUIPID
    join EQUIPMENTTYPE et with (nolock) on e.EQUIPTYPEID=et.EQUIPTYPEID
    where d.DEPTHID not in (select depthid from productlocation) 
    and d.SIZEID in (select SIZEID from SIZEPARAM where SizeCategoryID in (10,20,30,40,50,60,70,210))
    group by et.EQUIPTEXT,e.EQUIPTEXT, d.SIZEid, s.SIZEID, s.SIZETEXT, d.LOCATIONTYPE
    ) t
    group by t.EquipmentType, t.EquipmentName, t.LocationName, t.LocationCount, t.Used_Or_UnUsed, t.LocationID, t.LocationType
union all   
select EquipmentType, EquipmentName, LocationName, LocationCount, Used_Or_UnUsed,  LocationID, LocationType
from 
    (select et.equiptext EquipmentType, 
    e.EQUIPTEXT EquipmentName,
    s.SIZETEXT LocationName, count(*) LocationCount, 'Used Locations' as Used_Or_UnUsed, s.sizeid LocationID ,
    case when d.LOCATIONTYPE=1 then 'Pick Location' when d.LOCATIONTYPE=2 then 'Buffer Location' else 'Unknown' end as LocationType
    from depth d with (nolock)
    join SIZEPARAM s with (nolock) on d.SIZEID=s.SIZEID
    join POSITIONS p with (nolock) on d.POSITIONID=p.POSITIONID
    join shelf sh with (nolock) on p.SHELFID=sh.SHELFID
    join EQUIPMENT e with (nolock) on sh.EQUIPID=e.EQUIPID
    join EQUIPMENTTYPE et with (nolock) on e.EQUIPTYPEID=et.EQUIPTYPEID
    where d.DEPTHID in (select depthid from productlocation) 
    and d.SIZEID in (select SIZEID from SIZEPARAM where SizeCategoryID in (10,20,30,40,50,60,70,210))
    group by et.EQUIPTEXT,e.EQUIPTEXT, d.SIZEid, s.SIZEID, s.SIZETEXT, d.LOCATIONTYPE
    ) t 
    group by t.EquipmentType, t.EquipmentName, t.LocationName, t.LocationCount, t.Used_Or_UnUsed, t.LocationID, t.LocationType
    order by t.EquipmentName asc

Пожалуйста, прости мое дерьмовое форматирование этого вопроса.

2 ответа

Решение

С вашего разрешения я не буду повторять весь запрос. И поставьте здесь суть того, что вам нужно.

  SELECT d.depthid AS depthid
        ,CASE WHEN pr.depthid IS NULL THEN 1 END AS not_in_flag
        ,CASE WHEN pr.depthid IS NOT NULL THEN 1 END AS in_flag
    FROM depth d
    LEFT OUTER JOIN productlocation pr
      ON d.depthid = pr.depthid

Просто двигаться d.depthid [not] in (select depthid from productlocation) из вашего предложения WHERE (где он заставляет вас получить только один набор или другой) в ваше предложение select с помощью CASE WHEN:

select 
  et.equiptext as equipmenttype, 
  e.equiptext as equipmentname,
  s.sizetext as locationname, 
  count(*) as locationcount, 
  case when d.depthid in (select depthid from productlocation) then 'Used Locations' 
       else 'Empty Locations'
  end as used_or_unused, 
  s.sizeid as locationid,
  case when d.locationtype = 1 then 'pick location' 
       when d.locationtype = 2 then 'buffer location' 
       else 'unknown' 
  end as locationtype
from depth d with (nolock)
join sizeparam s with (nolock) on d.sizeid = s.sizeid
join positions p with (nolock) on d.positionid = p.positionid
join shelf sh with (nolock) on p.shelfid = sh.shelfid
join equipment e with (nolock) on sh.equipid = e.equipid
join equipmenttype et with (nolock) on e.equiptypeid = et.equiptypeid
where d.sizeid in (select sizeid from sizeparam where sizecategoryid in (10,20,30,40,50,60,70,210))
group by et.equiptext, e.equiptext, d.sizeid, s.sizeid, s.sizetext, d.locationtype
order by e.equiptext asc
Другие вопросы по тегам