I have a table that has ids that repeat. I want an id that has all three values (TWIX
, HERSHYS
, and M&MS
). The values can be on different lines but I do not know how to find the id by using statements that go line by line rather then by groups.
I have tried (in Microsoft SQL server)
select *, case when 'Hershys' in (Col1, Ccol2) then 1 else 0 as case1, case when 'TWIX' in (Col1, Col2) then 1 else 0 as case2, case when 'M&M' in (Col1, Col2) then 1 else 0 as case3 into #candyflags_t1 from table select * from #candyflags_t1 where case1 > 0 and case2> 0 and case3 > 0
This does not work due to SQL going line by line. How should I go about either creating flags or querying this in order to find which id group has all three values?
+--------------------+----------+ | ID | Col1 | Col2 | +---------------------+----------+ | L123 | TWIX | | +--------------------+----------+ | L123 | Hershys | | +--------------------+-----------+ | L123 | | m&ms | +--------------------+----------+ | F143 | | m&ms | +--------------------+----------+ | F143 | Snickers | gummies | +--------------------+----------+
In this table I would want to find L123 but not F143.
Advertisement
Answer
You can use group by
and having
. If you want the ids that have all three brands:
select id from table t cross apply (values (col1), (col2)) v(col) where col in ('Hershys', 'TWIX', 'M&M') group by id having count(distinct col) = 3;
cross apply
is a convenient way of unpivoting the data, so you can deal with one column instead of two.