如何使用 SQL 将数据分类为 3 个按字母顺序排列的子组?
How can I sort data into 3 alphabetical subgroups with SQL?
我正在使用 SQL 为我学校的老师显示学生数据,出于可用性原因,它需要以非常独特的排序显示,用字母表的 3 个子集划分数据集,然后进行正常排序在那里面。
它应该吐出这样的东西:
姓氏 A-F,按句号排序,然后按姓氏排序
姓氏 G-O,按句号排序,然后按姓氏排序
姓氏 P-Z,按句号排序,然后按姓氏排序
它目前按句点和姓氏排序相当简单,我可以使用三个不同的查询来拆分数据,但我不知道如何在一个中完成。
SELECT * FROM Student ORDER BY per, last;
您是否在 order by
中查找条件表达式?
order by (case when last < 'G' then 1
when last < 'P' then 2
else 3
end),
per, last
您可能想尝试这样的事情:
SELECT
CASE
WHEN LEFT(UPPER(last), 1) BETWEEN 'A' AND 'F' THEN 1
WHEN LEFT(UPPER(last), 1) BETWEEN 'G' AND 'O' THEN 2
WHEN LEFT(UPPER(last), 1) BETWEEN 'P' AND 'Z' THEN 3
ELSE 4
END AS LETTER_GROUP,
per,
last
FROM
Student
ORDER BY 1,2,3;
您不能真正将设置的结果分解为 groups/partitions。您可以 group 使用 group by
子句的结果集,但每组汇总到一行。还有 over/partition by
,但它更具分析性。你会想做这样的事情:
select group_1 = case
when upper(substring(t.surname,1,1)) between 'A' and 'F' then '1:A-F'
when upper(substring(t.surname,1,1)) between 'G' and 'O' then '2:G-O'
when upper(substring(t.surname,1,1)) between 'P' and 'Z' then '3:P-Z'
else '4:Other'
end,
*
from my_table t -- SORT SEQUENCE:
order by 1, -- 1. Ordinal Column 1 (grouping by letter of last name)
t.period, -- 2. Period
t.surname -- 3. Surname
你没说你用的是什么口味的 SQL。根据您的 DBMS 使用的方言,您必须重述第一列
group_1 = case ... end
成为
case ... end as group_1
我正在使用 SQL 为我学校的老师显示学生数据,出于可用性原因,它需要以非常独特的排序显示,用字母表的 3 个子集划分数据集,然后进行正常排序在那里面。
它应该吐出这样的东西:
姓氏 A-F,按句号排序,然后按姓氏排序
姓氏 G-O,按句号排序,然后按姓氏排序
姓氏 P-Z,按句号排序,然后按姓氏排序
它目前按句点和姓氏排序相当简单,我可以使用三个不同的查询来拆分数据,但我不知道如何在一个中完成。
SELECT * FROM Student ORDER BY per, last;
您是否在 order by
中查找条件表达式?
order by (case when last < 'G' then 1
when last < 'P' then 2
else 3
end),
per, last
您可能想尝试这样的事情:
SELECT
CASE
WHEN LEFT(UPPER(last), 1) BETWEEN 'A' AND 'F' THEN 1
WHEN LEFT(UPPER(last), 1) BETWEEN 'G' AND 'O' THEN 2
WHEN LEFT(UPPER(last), 1) BETWEEN 'P' AND 'Z' THEN 3
ELSE 4
END AS LETTER_GROUP,
per,
last
FROM
Student
ORDER BY 1,2,3;
您不能真正将设置的结果分解为 groups/partitions。您可以 group 使用 group by
子句的结果集,但每组汇总到一行。还有 over/partition by
,但它更具分析性。你会想做这样的事情:
select group_1 = case
when upper(substring(t.surname,1,1)) between 'A' and 'F' then '1:A-F'
when upper(substring(t.surname,1,1)) between 'G' and 'O' then '2:G-O'
when upper(substring(t.surname,1,1)) between 'P' and 'Z' then '3:P-Z'
else '4:Other'
end,
*
from my_table t -- SORT SEQUENCE:
order by 1, -- 1. Ordinal Column 1 (grouping by letter of last name)
t.period, -- 2. Period
t.surname -- 3. Surname
你没说你用的是什么口味的 SQL。根据您的 DBMS 使用的方言,您必须重述第一列
group_1 = case ... end
成为
case ... end as group_1