SELECT
student_number,
CASE
WHEN MIN(COALESCE(race, 'Unkown')) = MAX(COALESCE(race, 'Unkown'))
THEN MIN(COALESCE(race, 'Unkown'))
ELSE 'Two or more races'
END AS races
FROM students
GROUP BY student_number
ORDER BY student_number;
SELECT
student_number,
LISTAGG(COALESCE(race, 'Unkown'),',') WITHIN GROUP (ORDER BY student_number) "Two or more races"
FROM students
GROUP BY student_number;
您需要聚合。您将聚合数据,以便每个学生号(GROUP BY student_number)占一行。然后检查最小种族数(即字母顺序中的第一个)是否等于最大种族数。
select
student_number,
case when min(race) = max(race) then min(race) else 'Two or more races' end as races
from mytable
group by student_number
order by student_number;
2条答案
按热度按时间s2j5cfk01#
[编辑]考虑@Thorsten Kettner的解决方案,要考虑
NULL
值,只需在race
字段上添加COALESCE子句:输入:
| 学生编号|种族|
| - ------|- ------|
| 小行星5144|白色|
| 小行星5144|亚洲人|
| 小行星5145|零|
| 小行星5146|白色|
输出:
| 学生编号|种族|
| - ------|- ------|
| 小行星5144|两个或多个种族|
| 小行星5145|不详|
| 小行星5146|白色|
但是,如果您希望将每次出现的"Race"聚合到名为"Two or more races"的单个列中(例如,用逗号分隔),则需要Oracle的LISTAGG函数:
输出:
| 学生编号|种族|
| - ------|- ------|
| 小行星5144|亚洲人,白人|
| 小行星5145|不详|
| 小行星5146|白色|
在sqlfiddle中演示。
q3aa05252#
您需要聚合。您将聚合数据,以便每个学生号(
GROUP BY student_number
)占一行。然后检查最小种族数(即字母顺序中的第一个)是否等于最大种族数。