Home > Blockchain >  Case expression using subquery
Case expression using subquery

Time:10-04

I need some help with case expression, subqueries and joins. I have the following two tables below

Table 1: Orders

Order Order Date Order By
1 9/25/22 Bill
2 10/3/22 Susan
3 7/12/22 Jane
4 4/21/21 Susan

Table 2: Progress

Order Status
1 Baked
1 Delivered
2 Baked
3 Baked
3 Delivered
4 Baked

I'm trying to return all the results from Table 1 Orders and then if the order has a progress of "Delivered", I want to show that as well.
My intended results would exclude the following 4 columns and look like below:
Order
Order Date
Order By
Delivered (Case expression)

Results

Order Order Date Order By Delivered
1 9/25/22 Bill Yes
2 10/3/22 Susan No
3 7/12/22 Jane Yes
4 4/21/21 Susan No

This is what I tried code wise so far, but I know it's wrong.

    Select O.*, CASE WHEN(SELECT 1 FROM Progress WHERE Status = 'Delivered') THEN Y ELSE N END AS Delivered 
    FROM Orders O

CodePudding user response:

I think what you need here is an EXISTS as you want to check if the order has been delivered:

SELECT [Order], --Don't use Reserved Keywords for names; I strongly suggest changing this name
       [Order Date], --Try to avoid names that require delimit identification too
       [Order By], --ORDER BY is a clause is SQL too, so this isn't a great name choice either
       CASE WHEN EXISTS(SELECT 1
                        FROM dbo.Progress P
                        WHERE P.[Order] = O.[Order] 
                          AND P.Status = 'Delivered') THEN 'Y'
            ELSE 'N'
       END AS Delivered
FROM dbo.Orders O;

Alternatively, you could use aggregation and a JOIN, but this might be less ideal if you have more columns:

SELECT O.[Order],
       O.[Order Date],
       O.[Order By],
       MAX(CASE P.Status WHEN 'Delivered' THEN 'Y' ELSE 'N' END) AS Delivered
FROM dbo.Orders O
     JOIN dbo.Progress P ON O.[Order] = P.[Order] --I assume an order always has at least 1 status
GROUP BY O.[Order],
         O.[Order Date],
         O.[Order By];
  • Related