Take a look at example:
DECLARE @Donecode TABLE(FunctionId int, FunctionName nvarchar(50))
insert into @Donecode(FunctionId, FunctionName)
values(1,'Lifecycle'),(2,'Rohs'),(3,'Reach'),(4,'FMD'),(5,'Parametric'),
(6,'Package'),(7,'IntroductionDate'),(8,'MFG'),(9,'Qualification')
DECLARE @filedetails TABLE(FileID int, DoneCode nvarchar(50))
insert into @filedetails (FileID,DoneCode)
values (3301,'101011111'), (3301,'101101111'), (3301,'101001000')
;WITH CTE AS
(
SELECT FileID, 1 AS FunctionId, CONVERT(INT, LEFT(DoneCode, 1)) AS MyValue, RIGHT(DoneCode, LEN(DoneCode)-1) AS Remainder, ROW_NUMBER() OVER(ORDER BY FileID) AS RowNo
FROM @filedetails
UNION ALL
SELECT FileID, FunctionId + 1 AS FunctionId, CONVERT(INT, LEFT(Remainder, 1)) AS MyValue, RIGHT(Remainder, LEN(Remainder)-1) AS Remainder, RowNo AS RowNo
FROM CTE
WHERE LEN(Remainder)>0
)
SELECT dc.FunctionName, SUM(CASE WHEN c.MyValue = 1 THEN 1 ELSE 0 END) AS CountDoneCode, SUM(CASE WHEN c.MyValue = 0 THEN 1 ELSE 0 END) AS CountNotDoneCode
FROM CTE c INNER JOIN @Donecode dc ON c.FunctionId = dc.FunctionId
GROUP BY dc.FunctionId, dc.FunctionName
ORDER BY dc.FunctionId
I've used
CTE[
^] to split
DoneCode
into parts.
Result:
FunctionName CountDoneCode CountNotDoneCode
Lifecycle 3 0
Rohs 0 3
Reach 3 0
FMD 1 2
Parametric 1 2
Package 3 0
IntroductionDate 2 1
MFG 2 1
Qualification 2 1
Good luck!
BTW: your database structure is... invalid.