如何使用 SQL 将数据排序为 3 个按字母顺序排列的子组?

新手上路,请多包涵

我正在使用 SQL 为我学校的教师显示学生数据,出于可用性原因,它需要以非常独特的排序方式显示,用 3 个字母表子集划分数据集,然后在其中进行正常排序。

它应该吐出这样的东西:

姓氏 AF,按句点排序,然后按姓氏

姓 GO,按句点排序,然后按姓氏

姓氏 PZ,按句号排序,然后按姓氏

它目前按句点和姓氏进行排序相当简单,我可以使用三个不同的查询来拆分数据,但我不知道如何合二为一。

 SELECT * FROM Student ORDER BY per, last;

原文由 Luke Allpress 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 765
2 个回答

您是否在 order by 中寻找条件表达式?

 order by (case when last < 'G' then 1
               when last < 'P' then 2
               else 3
          end),
         per, last

原文由 Gordon Linoff 发布,翻译遵循 CC BY-SA 4.0 许可协议

您不能真正将结果集分解为组/分区。您可以使用 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

原文由 Nicholas Carey 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进