Query for row combine BEGIN
    declare @t1 table(
date1 date,
EmpID int,
bnumber varchar(24),
Name varchar(50),
Depname varchar(50),
mintime time,
maxtime time,
Status1 varchar(50))


insert into @t1 exec dbo.InOut2 @fromDate=@fdate,@toDate=@tdate


select distinct EmpID,
case when Status1='Present' then count (date1) end as 'Present',
case when Status1='Late-Absent' then count(date1) end as 'Late-Absent',
case when Status1='Absent'then count(date1)end as 'Absent' from  @t1
where date1 between @fdate and @tdate
group by EmpID, Status1


my output is like this

empid present late-absent  absent
124   null     null        3
124   null      5          null


but I want to see the output like these

empid  present  late-absent   absent
124     null          5           3


EDITS: - jcolebrand (brought in "answers" as edits with verbiage cleanup)

Instead of case what can I use to do this: 

max(case when Status1='Present' then count (date1) end) as 'Present' ,


When I use this I get:


  Cannot perform an aggregate function on an expression containing an aggregate or a subquery.


The result is still same I do not get my expected result, it's still

empid   present   late-absent    absent
124      0          0              3
124      0          5              0
You can't use COUNT inside another aggregate. What you're trying to do is add 1 for each row that meets the criteria, so use the CASE to return 1 or 0 depending of whether the criteria is met or not. Then aggregate the results of that CASE with a SUM:

SELECT EmpID,
SUM((CASE WHEN Status1='Present' THEN 1 ELSE 0 END)) end as 'Present',
SUM((CASE WHEN Status1='Late-Absent' THEN 1 ELSE 0 END)) end as 'Late-Absent',
SUM((CASE WHEN Status1='Absent' THEN 1 end ELSE 0 END)) as 'Absent' from  @t1
where date1 between @fdate and @tdate
GROUP BY EmpID


I also removed Status1 from your aggregate, because it would create a separate row for each occurrence of employee and Status1 - what you want is one row per employee only.