Order by column which casted to varchar
The Order by clause is the only one that guarantee the order.
But if you really want in back end , then you can add some additional columns/attributes to make it easier.
I added a  grp = group level and a subgroup grp_2 =group level 2.
For 0 ( 01-06 M ),0 ( 07-12 M ),0 ( 12 &lt; M ), the grp = 0
For monthly records, grp = 1
For TOTAL, grp = 2
And for grp_2, we have: 0 ( 01-06 M )grp_2 = 1,0 ( 07-12 M ) grp_2 = 2,0 ( 12 &lt; M ) grp_2 = 3 
For monthly records, grp_2 = LAC
For TOTAL, grp_2 = 0
And so, we are ordering by ORDER BY a.grp,a.grp_2
SELECT a.YDS,a.DataSet
FROM
(
    select N'0 ( 01-06 M )' as YDS ,CAST(AVG(FLUID_MERIT) as decimal(10, 2)) AS DataSet ,0 as grp,1 as grp_2
    from HerdAnalytics_tbl 
    where GRP = 12 and LAC = 0 and DATEDIFF(MONTH, FA_BDATE , GETDATE()) &lt;= 6 

    union 

    select N'0 ( 07-12 M )' as YDS ,CAST(AVG(FLUID_MERIT) as decimal(10, 2)) AS DataSet,0 ,2
    from HerdAnalytics_tbl 
    where GRP = 12 and LAC = 0 and DATEDIFF(MONTH, FA_BDATE , GETDATE()) &gt; 6 and DATEDIFF(MONTH, FA_BDATE , GETDATE()) &lt;= 12 

    union 

    select N'0 ( 12 &lt; M )' as YDS ,CAST(AVG(FLUID_MERIT) as decimal(10, 2)) AS DataSet ,0,3
    from HerdAnalytics_tbl 
    where GRP = 12 and LAC = 0 and DATEDIFF(MONTH, FA_BDATE , GETDATE()) &gt; 12 

    union 

    select CAST(LAC as varchar),CAST(AVG(FLUID_MERIT) as decimal(10, 2)) AS DataSet ,1,Lac
    from HerdAnalytics_tbl 
    where GRP = 12 
        and LAC in (select LAC from HerdAnalytics_tbl where FARM_FK = 10048 and LAC != 0)  
    group by LAC

    union 

    select 'TOTAL' as YDS ,CAST(AVG(FLUID_MERIT) as decimal(10, 2)) AS DataSet ,2,0
    from HerdAnalytics_tbl 
    where GRP = 12
)as a
ORDER BY a.grp,a.grp_2

output:
YDS             DataSet
0 ( 01-06 M )   NULL
0 ( 07-12 M )   NULL
0 ( 12 &lt; M )    234.56
3               234.56
4               234.56
10              234.56
TOTAL           234.56

dbfiddle