question

Alora101 avatar image
Alora101 asked

Trying to get just one row

hi i dont know where to put the select top one statement, i just want to get a single row from the case statement. any help will be appreciated. CASE WHEN cast(VehicleCC as varchar (50)) BETWEEN -1 AND 50 THEN 'B1' WHEN cast(VehicleCC as varchar (50)) BETWEEN 51 AND 125 THEN 'B2' WHEN cast(VehicleCC as varchar (50)) BETWEEN 126 AND 500 THEN 'B3' WHEN cast(VehicleCC as varchar (50)) BETWEEN 501 AND 650 THEN 'B4' WHEN cast(VehicleCC as varchar (50)) BETWEEN 651 AND 1000 THEN 'B5' WHEN cast(VehicleCC as varchar (50)) > 1001 THEN 'B6' ELSE (SELECT TOP(1) VEH.VehicleCC FROM HIRE_INSTRUCTION HIRP INNER JOIN VEHICLE VEH ON HIRP.FKFleetVehicleID=VEH.vehicleid WHERE HIRP.FKBLDRefID=cl.FKBLDRefID AND HIRP.Deleted=0 AND VEH.Deleted=0 ORDER BY veh.VehicleCC DESC) END AS VehicleCC,
sql-server-2008-r2
1 comment
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

bhanupratapsngh9 avatar image bhanupratapsngh9 commented ·
dear Alora, please provide tables create script with 5 rows so that we will be able to do it as soon as possible.
0 Likes 0 ·

1 Answer

·
KenJ avatar image
KenJ answered
I was about to say "The SELECT always comes first" when I realized that you are using the query to populate the ELSE portion of your case statement. I think that, in general, having subqueries to populate a single column directly isn't a good practice. In your case, I would prefer to do a JOIN to the subquery (using max(VehicleCC) rather than top(1) order by VehicleCC DESC) so the query only executes once rather than running once for each row in the result set. Try this: SELECT CASE WHEN CAST(VehicleCC AS VARCHAR(50)) BETWEEN -1 AND 50 THEN 'B1' WHEN CAST(VehicleCC AS VARCHAR(50)) BETWEEN 51 AND 125 THEN 'B2' WHEN CAST(VehicleCC AS VARCHAR(50)) BETWEEN 126 AND 500 THEN 'B3' WHEN CAST(VehicleCC AS VARCHAR(50)) BETWEEN 501 AND 650 THEN 'B4' WHEN CAST(VehicleCC AS VARCHAR(50)) BETWEEN 651 AND 1000 THEN 'B5' WHEN CAST(VehicleCC AS VARCHAR(50)) > 1001 THEN 'B6' ELSE defaultVehicle.VehicleCC END AS VehicleCC /* ... your other columns ... */ FROM vehicle_table AS cl LEFT JOIN ( SELECT MAX(veh.VehicleCC) , HIRP.FKBLDRefId FROM HIRE_INSTRUCTION AS HIRP INNER JOIN VEHICLE AS VEH ON HIRP.FKFleetVehicleID = VEH.VehicleID WHERE HIRP.Deleted = 0 AND VEH.Deleted = 0 GROUP BY HIRP.FKBLDRefID ) AS defaultVehicle ON cl.FKBLDRefID = defaultVehicle.FDBLDRefID
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Write an Answer

Hint: Notify or tag a user in this post by typing @username.

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.