indofraiser
indofraiser

Reputation: 1024

Extract a value based on a Row Number or CASE select

Code below gets my the right row, however I'd like to return one value only, without having to put much more (any) CASE on it. I could recheck which of the two values from the row is lowest but the actual values I'm looking for are not alphabetical in the 'real world' thus assigning them values.

If I get back either the lowest field text or the CASE number i.e. 20 that would be ideal. I'm just not sure where to go next, without rechecking the two fields.

Code:

DECLARE @ID INT  = '1234';

WITH GetMyInfo AS 
(
SELECT field1, field2 , ID
              , ROW_NUMBER() OVER (PARTITION BY ID,NAME ORDER BY CASE
              WHEN ISNULL(field1, field2) = 'z' THEN 20
              WHEN ISNULL(field1, field2) = 'b' THEN 10
              WHEN ISNULL(field1, field2) = 't' or  ISNULL(field1, field2) = 'f' THEN 0   
ELSE 20
END) [RowNumber]
FROM TABLE
WHERE 
             (field1 IS NOT NULL OR field2 IS NOT NULL)
              AND ID= @ID 
)
SELECT    field, field2
FROM GetMyInfo 
WHERE RowNumber = 1

I'd like something like Return RowNumberValue

Upvotes: 0

Views: 659

Answers (2)

Gordon Linoff
Gordon Linoff

Reputation: 1269773

Hmmm . . . I think you can do:

WITH GetMyInfo AS (
      SELECT t.*, field,
             ROW_NUMBER() OVER (PARTITION BY ID, NAME
                                ORDER BY (CASE WHEN field = 'z' THEN 20
                                               WHEN field = 'b' THEN 10
                                               WHEN field in ('t', 'b') THEN 0 
                                               WHEN field is null THEN 100
                                               ELSE 20
                                           END)) [RowNumber]
       FROM TABLE t CROSS APPLY
            (VALUES (field1), (field2)) as v(field)
       WHERE (field1 IS NOT NULL OR field2 IS NOT NULL) AND ID= @ID 
      )
SELECT  field
FROM GetMyInfo 
WHERE RowNumber = 1;

This unpivots the data, so you can only return the matching value.

Upvotes: 1

Karen Avdalyan
Karen Avdalyan

Reputation: 392

You can use one extra query to achieve what you want if it's ok for you

DECLARE @ID INT  = '1234';

WITH GetMyInfo AS 
(
SELECT field1,field2,caseNumber,ROW_NUMBER() OVER (PARTITION BY ID,NAME 
ORDER BY [caseNumber] )[RowNumber]
FROM
(SELECT field1, field2 , ID,NAME
          ,  CASE
          WHEN ISNULL(field1, field2) = 'z' THEN 20
          WHEN ISNULL(field1, field2) = 'b' THEN 10
          WHEN ISNULL(field1, field2) = 't' or  ISNULL(field1, field2) = 'f' 
THEN 0   
ELSE 20
END) [caseNumber]
FROM TABLE
)A
WHERE 
             (field1 IS NOT NULL OR field2 IS NOT NULL)
              AND ID= @ID 
)
SELECT    field, field2,caseNumber
FROM GetMyInfo 
WHERE RowNumber = 1

Upvotes: 1

Related Questions