I'm trying to create a (sqlite) query that will perform a GROUP BY but will not group anything with the value 'unknown'. For example, I have the table:
id | name | parent_id | school_id |
1 | john | 1 | 1 |
2 | john | 1 | 1 |
3 | john | 1 | 1 |
4 | nick | 2 | 2 |
5 | nick | 2 | 2 |
6 | nick | 3 | 3 |
7 | bob | 4 | 4 |
8 | unknown | 5 | 5 |
9 | unknown | 5 | 5 |
10| unknown | 5 | 5 |
With the proper query with 'GROUP BY name, parent_id, school_id' I need the following rows returned:
id | name | parent_id | school_id |
1 | john | 1 | 1 |
3 | nick | 2 | 2 |
4 | nick | 3 | 3 |
5 | bob | 4 | 4 |
6 | unknown | 5 | 5 |
7 | unknown | 5 | 5 |
8 | unknown | 5 | 5 |
Any help would be greatly appreciated. Thanks!
As a single query...
SELECT
MIN(id) AS id,
name,
parent_id,
school_id
FROM
yourTable
GROUP BY
CASE WHEN name = 'unknown' THEN id ELSE 0 END,
name,
parent_id,
school_id
Or possibly...
GROUP BY
CASE WHEN name <> 'unknown' THEN name ELSE CAST(id AS VARCHAR(???)) END,
parent_id,
school_id
-- Where VARCHAR(???) is the data type of the `name` field.
-- Also assumes no value in `name` is the same as an id for an 'unknown' field
Both avoid UNION and the overhead of parsing the table twice, replacing it with a slightly increased complexity GROUP BY.
You can't easily do this with one statement but you can UNION the results of two statements
GROUP the list of all but unknown
UNION) the list of all unknown
SQL Statement
SELECT MIN(id), name, parent_id, school_id
FROM YourTable
WHERE name <> 'unknown'
GROUP BY
name, parent_id, school_id
UNION ALL
SELECT id, name, parent_id, school_id
FROM YourTable
WHERE name = 'unknown'
Note that I assume you have posted wrong unknown id's in your result
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With