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