英文:
Combine rows when a person has more than one race, to a single row called Two or more Races
问题
在Oracle SQL中,您可以使用以下查询来将具有多个种族的学生合并为一行,命名为"Two or more races":
SELECT
  student_number,
  CASE
    WHEN COUNT(DISTINCT race) > 1 THEN 'Two or more races'
    ELSE MAX(race)
  END AS race
FROM your_table
GROUP BY student_number;
这个查询将对学生进行分组,如果学生具有不止一种种族,那么将种族设置为"Two or more races",否则将保留其中的一个种族。
英文:
Some students within my district have more than one race. I am trying to create a column in Oracle SQL with the students race but I am getting multiple rows for one student because the student has more than one race. I want to combine them into one row called Two or more races. Here is a little example:
Select 
student_number,
race
| Student_Number | Race | 
|---|---|
| 5144 | White | 
| 5144 | Asian | 
Any idea on how I could combine them into one row, or is that more something you would do in Python.
答案1
得分: 1
[编辑] 考虑到[@Thorsten Kettner][1]的解决方案,要考虑`NULL`值,只需在`race`字段上添加[COALESCE][2]子句:
```sql
SELECT
  student_number,
  CASE
    WHEN MIN(COALESCE(race, '未知')) = MAX(COALESCE(race, '未知'))
      THEN  MIN(COALESCE(race, '未知'))
      ELSE '两个或更多种族'
  END AS 种族
FROM students
GROUP BY student_number
ORDER BY student_number;
输入:
| 学生号码 | 种族 | 
|---|---|
| 5144 | 白人 | 
| 5144 | 亚洲人 | 
| 5145 | NULL | 
| 5146 | 白人 | 
输出:
| 学生号码 | 种族 | 
|---|---|
| 5144 | 两个或更多种族 | 
| 5145 | 未知 | 
| 5146 | 白人 | 
然而,如果你想要将每个"种族"的出现聚合到一个名为'两个或更多种族'的单独列中(假设用逗号分隔),你需要使用Oracle的LISTAGG函数:
SELECT
  student_number,
  LISTAGG(COALESCE(race, '未知'),',') WITHIN GROUP (ORDER BY student_number) AS "两个或更多种族"
FROM students
GROUP BY student_number;
输出:
| 学生号码 | 种族 | 
|---|---|
| 5144 | 亚洲人, 白人 | 
| 5145 | 未知 | 
| 5146 | 白人 | 
在sqlfiddle上查看演示。
<details>
<summary>英文:</summary>
[Edit] Considering the solution from [@Thorsten Kettner][1], to take account of `NULL` values just add the [COALESCE][2] clause on the `race` field:
```sql
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;
Input:
| student_number | race | 
|---|---|
| 5144 | White | 
| 5144 | Asian | 
| 5145 | NULL | 
| 5146 | White | 
Output:
| student_number | races | 
|---|---|
| 5144 | Two or more races | 
| 5145 | Unknown | 
| 5146 | White | 
However, if you want to aggregate each occurrence of "Race" in a single column named 'Two or more races' (let's say, separated by a comma), you'll need the LISTAGG function from Oracle:
SELECT
  student_number,
  LISTAGG(COALESCE(race, 'Unkown'),',') WITHIN GROUP (ORDER BY student_number) "Two or more races"
FROM students
GROUP BY student_number;
Output:
| student_number | races | 
|---|---|
| 5144 | Asian, White | 
| 5145 | Unknown | 
| 5146 | White | 
Demo in sqlfiddle.
答案2
得分: 0
你需要进行数据聚合。你将聚合你的数据,以便每个学生编号 (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;
英文:
You want aggregation. You'll aggregate your data so as to get one row per student number (GROUP BY student_number). Then check whether the minimum race (i.e. first in alphabetical order) equals the maximum one.
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;
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论