如何使用 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