patternsqlModerate
Select rows with same id but null and some other value in another column for that id
Viewed 0 times
rowssamecolumnwithnullbutvaluethatsomeanother
Problem
I want to get only rows having a value
If both rows have null for that particular username or both have some values other than null then it should not appear in output. If there are more than two rows for same username with null and some other value then they should appear.
Below is example sample and output. How it can be done using sql query?
output
NULL and some other value than NULL for a particular username column.If both rows have null for that particular username or both have some values other than null then it should not appear in output. If there are more than two rows for same username with null and some other value then they should appear.
Below is example sample and output. How it can be done using sql query?
+----------+-------+
| username | col2 |
+----------+-------+
| a | abc |
| a | ef |
| b | null |
| b | null |
| c | der |
| c | null |
+----------+-------+output
+----------+------+
| username | col2 |
+----------+------+
| c | der |
| c | null |
+----------+------+Solution
You should be able to use conditional aggregation to get the username with both a value in
I'd suggest using a HAVING clause with the conditions. The query would be similar to:
See SQL Fiddle with Demo. This query groups your data by each username and then uses conditional logic to check if
You can then use this in a subquery, etc to get the
See SQL Fiddle with Demo.
If you have more than one
See SQL Fiddle with Demo
col2 as well as null.I'd suggest using a HAVING clause with the conditions. The query would be similar to:
select username
from yourtable
group by username
having sum(case when col2 is not null then 1 else 0 end) = 1
and sum(case when col2 is null then 1 else 0 end) = 1See SQL Fiddle with Demo. This query groups your data by each username and then uses conditional logic to check if
col2 meets both conditions you want - where col2 is not null and col2 is null.You can then use this in a subquery, etc to get the
username and col2 values:select
t.username,
t.col2
from yourtable t
inner join
(
select username
from yourtable
group by username
having sum(case when col2 is not null then 1 else 0 end) = 1
and sum(case when col2 is null then 1 else 0 end) = 1
) d
on t.username = d.usernameSee SQL Fiddle with Demo.
If you have more than one
col2 row with both null and another value, then you just need to alter the HAVING clause slightly:select
t.username,
t.col2
from yourtable t
inner join
(
select username
from yourtable
group by username
having sum(case when col2 is not null then 1 else 0 end) >= 1
and sum(case when col2 is null then 1 else 0 end) >= 1
) d
on t.username = d.username;See SQL Fiddle with Demo
Code Snippets
select username
from yourtable
group by username
having sum(case when col2 is not null then 1 else 0 end) = 1
and sum(case when col2 is null then 1 else 0 end) = 1select
t.username,
t.col2
from yourtable t
inner join
(
select username
from yourtable
group by username
having sum(case when col2 is not null then 1 else 0 end) = 1
and sum(case when col2 is null then 1 else 0 end) = 1
) d
on t.username = d.usernameselect
t.username,
t.col2
from yourtable t
inner join
(
select username
from yourtable
group by username
having sum(case when col2 is not null then 1 else 0 end) >= 1
and sum(case when col2 is null then 1 else 0 end) >= 1
) d
on t.username = d.username;Context
StackExchange Database Administrators Q#84297, answer score: 12
Revisions (0)
No revisions yet.