如何避免 SELECT 语句中用于排序的额外列到最终输出?

How to avoid the extra column used for ordering in the SELECT statement to the final output?

我有一个包含 ID, Workitem_Type, [STATUS], Workitem, CompletedDate, WORK, Log_createdDate

列的 table TestTable

数据看起来像:

+----+---------------+--------+-----------+-------------------------+-------+-------------------------+
| ID | Workitem_Type | STATUS | Workitem  |     CompletedDate       | WORK  |     Log_createdDate     |
+----+---------------+--------+-----------+-------------------------+-------+-------------------------+
|  1 | Remainder     | Pass   | Workitem1 | 2019-12-19 01:20:35.060 | Work1 | 2014-12-17 00:36:38.557 |
|  2 | Remainder     | Pass   | Workitem2 | 2019-12-19 01:20:35.060 | Work2 | 2015-12-17 00:36:38.557 |
|  3 | Remainder     | Pass   | Workitem3 | 2019-12-17 01:20:35.060 | Work3 | 2018-12-17 00:36:38.557 |
|  4 | Request       | Pass   | Workitem4 | 2019-12-18 01:20:35.060 | Work4 | 2017-12-17 00:36:38.557 |
|  5 | Remainder     | Pass   | Workitem5 | 2019-12-17 01:20:35.060 | Work5 | 2016-12-17 00:36:38.557 |
+----+---------------+--------+-----------+-------------------------+-------+-------------------------+

我必须根据 Workitem_TypeCompletedDate 给予优先级,并且应该在单个查询中按相同的优先级和 Log_createdDate 排序。所以输出应该如下所示:

+----+---------------+--------+-----------+-------------------------+-------+-------------------------+
| ID | Workitem_Type | STATUS | Workitem  |      CompletedDate      | WORK  |     Log_createdDate     |
+----+---------------+--------+-----------+-------------------------+-------+-------------------------+
|  1 | Remainder     | Pass   | Workitem1 | 2019-12-19 01:31:12.620 | Work1 | 2014-12-17 00:36:38.557 |
|  2 | Remainder     | Pass   | Workitem2 | 2019-12-19 01:31:12.637 | Work2 | 2015-12-17 00:36:38.557 |
|  5 | Remainder     | Pass   | Workitem5 | 2019-12-17 01:31:12.637 | Work5 | 2016-12-17 00:36:38.557 |
|  3 | Remainder     | Pass   | Workitem3 | 2019-12-17 01:31:12.637 | Work3 | 2018-12-17 00:36:38.557 |
|  4 | Request       | Pass   | Workitem4 | 2019-12-18 01:31:12.637 | Work4 | 2017-12-17 00:36:38.557 |
+----+---------------+--------+-----------+-------------------------+-------+-------------------------+

我尝试了以下查询:

SELECT  *, CASE WHEN Workitem_Type = 'Remainder' THEN 
               CASE WHEN CompletedDate > GETDATE() THEN 1 ELSE 2 END 
           ELSE 3 END AS [Priority] 
FROM TestTable
ORDER BY [Priority], Log_createdDate;

但我不希望Priority 列出现在我的输出 中。那么有没有办法在单个查询中获得没有优先级列的上述输出?

请找到相同的db<>fiddle

您可以将查询包含在子查询中并明确列出您希望 select 的字段,例如:

SELECT ID, Workitem_Type, STATUS, Workitem, CompletedDate, Work, Log_createdDate
FROM (
SELECT  *,CASE WHEN Workitem_Type = 'Remainder' THEN 
        CASE WHEN CompletedDate > GETDATE() THEN 1 ELSE 2 END 
    ELSE 3 END as [Priority] 
FROM TestTable
) as a
ORDER BY [Priority],
         Log_createdDate

直接在ORDER BY子句中使用表达式即可。

SELECT * 
       FROM testtable
       ORDER BY CASE
                  WHEN workitem_type = 'Remainder' THEN 
                    CASE
                      WHEN completeddate > getdate() THEN
                        1
                      ELSE
                        2
                    END 
                  ELSE
                    3
                END,
                log_createddate;

编辑:(作者:戈登)

您不需要嵌套 CASE 表达式:

   ORDER BY (CASE WHEN workitem_type = 'Remainder' AND completeddate > getdate()
                  THEN 1
                  WHEN workitem_type = 'Remainder' 
                  THEN 2
                  ELSE 3
             END),
            log_createddate;

您可以使用如下子查询:

select ID, Workitem_Type, STATUS
    , Workitem, CompletedDate
    , WORK, Log_createdDate 
 from (SELECT  *, CASE WHEN Workitem_Type = 'Remainder' THEN 
               CASE WHEN CompletedDate > GETDATE() THEN 1 ELSE 2 END 
           ELSE 3 END AS [Priority] 
       FROM TestTable
      ORDER BY [Priority], Log_createdDate)