Reputation: 1024
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
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
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