简体   繁体   中英

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

I have a table TestTable with columns ID, Workitem_Type, [STATUS], Workitem, CompletedDate, WORK, Log_createdDate

The data looks like:

+----+---------------+--------+-----------+-------------------------+-------+-------------------------+
| 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 |
+----+---------------+--------+-----------+-------------------------+-------+-------------------------+

I have to give priority based on Workitem_Type , CompletedDate and should order by the same priority and Log_createdDate in single query. So the output should look like the below:

+----+---------------+--------+-----------+-------------------------+-------+-------------------------+
| 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 |
+----+---------------+--------+-----------+-------------------------+-------+-------------------------+

I tried with the below query:

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;

But I don't want the Priority column to get appear in my output . So Is there anyway to get the above output without priority column in single query?

Please find the db<>fiddle for the same.

Just use the expression directly in the ORDER BY clause.

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;

EDIT: (by gordon)

You don't need to nest the CASE expressions:

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

You may enclose the query in a subquery and explicitly list the fields you wish to select, such as:

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

You can use a subquery like :

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM