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:
i
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.
SELECT MIN(id), name, parent_id, school_id
FROM Table
WHERE name <> 'unknown'
GROUP BY name, parent_id, school_id
UNION ALL
SELECT id, name, parent_id, school_id
FROM Table
WHERE name = 'unknown'
SELECT
MIN(id) AS id,
IF(tmpname=id,"unknown",tmpname) AS name,
parent_id,
school_id
FROM (
SELECT
id,parent_id,school_id
IF(name="unknown",id,name) AS tmpname
FROM <tablename>
) AS baseview
GROUP BY tmpname
You can't easily do this with one statement but you can UNION the results of two statements
GROUP the list of all but unknownUNION) the list of all unknownSQL 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