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)
x
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.