I am trying to figure out how to get a query to come back with certain rows if other rows contain certain data.
SKU | Bin |
---|---|
1234 | A1 |
1234 | NoBin |
4567 | NoBin |
8997 | Conveyor |
6543 | MLSTAGE |
2101 | A2 |
2101 | Conveyor |
This is a very simple version but I only want to see SKUs 4567, 8997, and 6543 come back because 1234 and 2101 are located in Bin A1 and A2. I only want to see items that are ONLY in NoBin, MLSTAGE, or Conveyor.
I can't figure out how to get it and of course there are millions of SKUs.
Any help would be great. Thank you
CodePudding user response:
select SKU
from T
group by SKU
having count(case when Bin not in ('NoBin', 'MLSTAGE', 'Conveyor') then 1 end) = 0
or equivalent (if there are nulls):
having count(case when Bin in ('NoBin', 'MLSTAGE', 'Conveyor') then 1 end) = count(*)
CodePudding user response:
You essentially want to check for existence, so EXISTS
seems a logical choice:
SELECT *
FROM YourTable T
WHERE NOT EXISTS (
SELECT NULL
FROM YourTable T2
WHERE T2.Bin NOT IN ('NoBin', 'MLSTAGE', 'Conveyor')
AND T2.SKU = T.SKU
)
AND T.Bin IN ('NoBin', 'MLSTAGE', 'Conveyor')
CodePudding user response:
you could use a not exists
select * from mytable a
where not exists (
select 1 from mytable b
where a.sku = b.sku and b.bin not in
('NoBin', 'MLSTAGE', 'Conveyor'))
here is the fiddle https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=5c370c7766acfbb9552bbbd32cf5e03a
CodePudding user response:
SELECT
SKU
FROM [SKU TEST]
WHERE SKU NOT IN
(
SELECT SKU
FROM [SKU TEST]
WHERE BIN NOT IN ('NoBin', 'Conveyor', 'MLSTAGE')
)
Inner query is used to build a set of SKU that are associated with everything you don't want, so not in your 3 criteria. The outer query is generating a list of SKU's that are not in your inner set which should give you want you want. I went with basic script to ensure it would work with pretty much any RDBMS.