不排序的排序 SQL

Order By Without Sorting SQL

有没有办法在不排序的情况下将列一起排序?

我有以下声明:

SELECT Name,Email, MondayHours1 FROM tbl_scheduel
Union All
SELECT Name,Email, MondayHours2 FROM tbl_scheduel

产生:

Mike   | Email  |  8:00 to 5:00 |  8:00 to 5:00
Aimee  | Email  | 11:00 to 5:00 | 11:00 to 5:00
Mike   | Email  |  5:30 to 6:00 |  5:00 to 6:00
Aimee  | Email  |  5:30 to 6:00 | 5:00 to 6:00

添加 Order By name 当然会将它们组合在一起;

Aimee  | Email  |  5:30 to 6:00 |  5:00 to 6:00
Aimee  | Email  | 11:00 to 5:00 | 11:00 to 5:00
Mike   | Email  |  8:00 to 5:00 |  8:00 to 5:00
Mike   | Email  |  5:30 to 6:00 |  5:00 to 6:00

但是不排序怎么排序呢?这样可以吗,我需要mike保持在最前面

"Ordering" == "Sorting"。 SQL 关键字告诉 DBMS 对结果集执行排序操作。在 "ORDER BY" 子句改为措辞 "SORT BY" 的替代宇宙中,基础操作不会改变。

结果排序通常在主要 DBMS 中非常有效地实现,尽管在一般情况下对排序的复杂性有最低限度;如果 N 是预期结果的数量,则与无序查询相比,执行有序查询将花费 NlogN 额外时间。这可以通过索引提高效率;如果您在索引上排序,通常可以通过遍历索引树按该顺序直接从数据文件中检索信息,这比检索然后重新排序内存中的乱序序列需要更少的操作.

如果 Mike 需要排在最前面,您可以 ORDER BY name DESC,或者您可以按特定字段排序,指示正确的排序顺序,独立于任何显示的列。但是,如果您希望结果按特定顺序排列,则必须告诉 DBMS 按该顺序排列它们。

使用 Case 语句,您可以在 order by 中自定义排序以预先获取所需数据。

SELECT Name,
       Email,
       MondayHours1
FROM   tbl_scheduel
UNION ALL
SELECT Name,
       Email,
       MondayHours2
FROM   tbl_scheduel
ORDER  BY CASE
            WHEN name = 'mike' THEN 0
            ELSE 1
          END 

这不是解决您的问题的理想方法。您似乎希望根据该组中所有行的最早开始时间对 Name 组进行排序。如果您正在使用报告工具,您可能需要考虑使用它的分类工具来为您处理这部分问题。我还通过假设它始终包含一个冒号字符并且一天的开始是在早上 6 点来解析您的小时字符串。它不看会议记录,因为如您所见,它已经有点复杂了。如果您共享更多数据,可能会有更简单的方法。

with hours (Name, Email, Shift) as (
    SELECT Name, Email, MondayHours1 FROM tbl_scheduel
    Union All
    SELECT Name, Email, MondayHours2 FROM tbl_scheduel
)
select Name, Email, Shift
from hours
order by
    min(
        case
            when cast(left(@Shift, charindex(':', @Shift) - 1) as int) < 6
            then cast(left(@Shift, charindex(':', @Shift) - 1) as int) + 12
            else cast(left(@Shift, charindex(':', @Shift) - 1) as int)
        end
    ) over (partition by Name),
    Name,
    case
        when cast(left(@Shift, charindex(':', @Shift) - 1) as int) < 6
        then cast(left(@Shift, charindex(':', @Shift) - 1) as int) + 12
        else cast(left(@Shift, charindex(':', @Shift) - 1) as int)
    end;