如何避免 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_Type
、CompletedDate
给予优先级,并且应该在单个查询中按相同的优先级和 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)
我有一个包含 ID, Workitem_Type, [STATUS], Workitem, CompletedDate, WORK, Log_createdDate
数据看起来像:
+----+---------------+--------+-----------+-------------------------+-------+-------------------------+
| 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_Type
、CompletedDate
给予优先级,并且应该在单个查询中按相同的优先级和 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)