oracle 当一个人有多个种族时,将行合并为一个名为“两个或多个种族”的行

u7up0aaq  于 2023-03-01  发布在  Oracle
关注(0)|答案(2)|浏览(177)

我所在学区的一些学生有多个种族。我尝试在Oracle SQL中创建一个包含学生种族的列,但由于一个学生有多个种族,因此会为该学生获取多个行。我希望将它们合并到一个名为“两个或多个种族”的行中。下面是一个小示例:

Select 
student_number,
race

| 学生_人数|种族|
| - ------|- ------|
| 小行星5144|白色|
| 小行星5144|亚洲人|
你知道我怎么把它们组合成一行吗,或者你会用Python做更多的事情。

s2j5cfk0

s2j5cfk01#

[编辑]考虑@Thorsten Kettner的解决方案,要考虑NULL值,只需在race字段上添加COALESCE子句:

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;

输入:
| 学生编号|种族|
| - ------|- ------|
| 小行星5144|白色|
| 小行星5144|亚洲人|
| 小行星5145|零|
| 小行星5146|白色|
输出:
| 学生编号|种族|
| - ------|- ------|
| 小行星5144|两个或多个种族|
| 小行星5145|不详|
| 小行星5146|白色|
但是,如果您希望将每次出现的"Race"聚合到名为"Two or more races"的单个列中(例如,用逗号分隔),则需要Oracle的LISTAGG函数:

SELECT
  student_number,
  LISTAGG(COALESCE(race, 'Unkown'),',') WITHIN GROUP (ORDER BY student_number) "Two or more races"
FROM students
GROUP BY student_number;

输出:
| 学生编号|种族|
| - ------|- ------|
| 小行星5144|亚洲人,白人|
| 小行星5145|不详|
| 小行星5146|白色|
在sqlfiddle中演示。

q3aa0525

q3aa05252#

您需要聚合。您将聚合数据,以便每个学生号(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;

相关问题