【问题标题】:How to give priority to a single employee while sorting the employee name in sql?如何在sql中对员工姓名进行排序时优先考虑单个员工?
【发布时间】:2021-12-21 01:24:59
【问题描述】:

我有像 TB1 这样的桌子:

Emp_name  Dept_name  salary
Girish    BB          20000
Bhanu     AA          10000
Mahesh    CC          10000
Seema     YY          30000

我需要的输出是:

Emp_name  Dept_name  salary
Mahesh    CC          10000
Bhanu     AA          10000
Girish    BB          20000
Seema     YY          30000

这里我所做的是优先考虑'Mahesh',其余所有员工都按升序排序。

我试过这个查询:

SELECT *
FROM Employee
ORDER BY CASE
    WHEN Emp_name LIKE '%Mahesh%' THEN 1
    WHEN Emp_name LIKE '%' THEN 2
    ELSE 3
end;

感谢您的宝贵时间。

【问题讨论】:

  • 你的问题是什么?
  • 这个查询首先对 Mahesh 进行排序,然后是所有其他的,然后是 null。没有字母顺序发生,因为您没有告诉 DBMS 这样做。如果要按字母顺序对其他名称进行排序,请将其添加到 ORDER BY 子句:ORDER BY CASE ... END, emp_name

标签: sql sql-server tsql sql-query-store


【解决方案1】:

SELECT *
FROM Employee
ORDER BY 
   CASE
      WHEN Emp_name Like '%Mahesh%' THEN 1
      ELSE 2
   END,
   Dept_name ASC, salary ASC

【讨论】:

  • 没有。这将选择名称不为空的所有员工,然后按字母顺序对它们进行排序。详细说明:首先,UNION ALL 发生,但由于表(包括查询结果)是无序数据集,Manesh 可以位于该中间结果中的任何位置。然后ORDER BY 子句对整个数据集起作用,将 Manesh 放在字母表中它所属的位置。
  • @ThorstenKettner 谢谢你的描述。但他想要这个输出。此查询首先将“Manesh”放在第一行。然后对其余的行进行排序。我的分数很低。请给我一个积极的投票。
  • 你还没有理解我的描述。不,您的查询没有将 Manesh 放在首位。它将它与所有其他排序(对不起,它不是上面错误提到的字母顺序,而是您查询中的部门和薪水顺序)。请再次阅读我所写的内容并理解您的误解。排序是 SQL 中的一个重要概念,您还没有完全理解它。
  • @ThorstenKettner。非常感谢您的帮助。是真的 。你说的对。我纠正了它。我的查询,虽然它有这个输出,但是是错误的,它的速度非常低。请给我投赞成票。
【解决方案2】:

只需使用正确的ORDER BY 子句:

样本数据:

SELECT *
INTO Employee
FROM (VALUES
   ('Girish', 'BB', 20000),
   ('Bhanu',  'AA', 10000),
   ('Mahesh', 'CC', 10000),
   ('Seema',  'YY', 30000)
) Employee (Emp_name, Dept_name, Salary)

声明:

SELECT *
FROM Employee
ORDER BY 
   CASE
      WHEN Emp_name LIKE '%Mahesh%' THEN 1
      ELSE 2
   END,
   Emp_name ASC

【讨论】:

    【解决方案3】:

    在 TB1 表上运行此查询

    CREATE TABLE TB2
    SELECT * FROM TB1 ORDER BY salary ASC;
    

    在哪里创建 TB2 运行此查询

    SELECT * FROM TB2 ORDER BY Dept_name='cc' DESC;
    

    【讨论】:

    • 我认为您误解了请求。 OP首先想要Manesh,然后是所有其他名字,似乎都是按字母顺序排列的。此外,表被认为是无序的数据集。因此,TB2 中的行不按薪水排序,只是因为您在填充查询时碰巧使用了带有ORDER BY 子句的查询。而ORDER BY Dept_name='cc' 无论如何都会覆盖它。您确定 SQL Server 可以通过布尔表达式进行排序吗?我认为没有。
    【解决方案4】:

    我的解决方案:

       SELECT Emp_name, Dept_name, Salary FROM (
    select T.*,
           CASE
             WHEN Emp_name = 'Mahesh' THEN
              0
             ELSE
              1
           END SORT1
      from (VALUES
       ('Girish', 'BB', 20000),
       ('Bhanu',  'AA', 10000),
       ('Mahesh', 'CC', 10000),
       ('Seema',  'YY', 30000)
    ) T (Emp_name, Dept_name, Salary)) TT
      ORDER BY TT.SORT1,TT.Emp_name
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 2015-12-29
      • 1970-01-01
      • 2017-01-07
      相关资源
      最近更新 更多