user3182246
user3182246

Reputation: 49

Oracle SQL Custom Sort with Union

I have 2 tables that I'm unioning and want to custom order using ORDER BY CASE but I keep getting the ORA-01785: ORDER BY item must be the number of a SELECT-list expression error.

My 2 tables each have a column named "VISIT", containing (something similar to) the following data:

FollowUp table: BASELINE, 1_MONTH, 2_MONTH

Procedure table: PROCEDURE

I want to union these tables and sort in the following order: BASELINE, PROCEDURE, 1_MONTH, 2_MONTH

Here is what I think should work:

SELECT VISIT
FROM FollowUp
UNION
SELECT VISIT
FROM Procedure
ORDER BY
    CASE VISIT
    WHEN 'BASELINE' THEN 1
    WHEN 'PROCEDURE' THEN 2
    WHEN '1_MONTH' THEN 3
    WHEN '2_MONTH' THEN 4
    ELSE 5 END

However I'm getting the 01785 error. I've also tried replacing CASE VISIT with CASE 1 and get the same error. Thank you for the help!

Upvotes: 3

Views: 2288

Answers (3)

OldProgrammer
OldProgrammer

Reputation: 12169

Try this:

  SELECT x.visit,
         CASE x.VISIT
            WHEN 'BASELINE' THEN 1
            WHEN 'PROCEDURE' THEN 2
            WHEN '1_MONTH' THEN 3
            WHEN '2_MONTH' THEN 4
            ELSE 5
         END
            sort_by
    FROM (SELECT VISIT FROM FollowUp
          UNION ALL
          SELECT VISIT FROM Procedure) x
ORDER BY SORT_BY

Upvotes: 2

nestavazquez
nestavazquez

Reputation: 43

Try this:

SELECT VISIT, CASE VISIT WHEN 'BASELINE' THEN 1 WHEN 'PROCEDURE' THEN 2 WHEN '1_MONTH' THEN 3 WHEN '2_MONTH' THEN 4 ELSE 5 END ORDERFIELD FROM FollowUp UNION SELECT VISIT, CASE VISIT WHEN 'BASELINE' THEN 1 WHEN 'PROCEDURE' THEN 2 WHEN '1_MONTH' THEN 3 WHEN '2_MONTH' THEN 4 ELSE 5 END ORDERFIELD FROM Procedure ORDER BY ORDERFIELD

Upvotes: 0

Gordon Linoff
Gordon Linoff

Reputation: 1270181

Try doing this with a subquery:

select visit
from ((SELECT VISIT
       FROM FollowUp
      ) union
      (SELECT VISIT
       FROM Procedure
      )
     ) t
ORDER BY
    CASE VISIT
    WHEN 'BASELINE' THEN 1
    WHEN 'PROCEDURE' THEN 2
    WHEN '1_MONTH' THEN 3
    WHEN '2_MONTH' THEN 4
    ELSE 5 END;

If you do not need duplicate removal, then use union all.

Upvotes: 3

Related Questions