AS
  BEGIN
  SET NOCOUNT ON


    ;WITH sgm
    AS (
	   SELECT s.SegmentID AS phSgId, s.SegmentName AS phSgName, s.DBId AS phSgDbId, 
			s.SegmentID AS SgId, s.SegmentName AS SgName, s.DBId AS SgDbId,
			0 AS Lvl
	   FROM dbo.IMSDBSegments s
	   WHERE EXISTS ( SELECT 1 
				   FROM #numeric_param_temp t 
				   WHERE t.ProgramID = s.SegmentId)

	    UNION ALL

	    SELECT p.phSgId, p.phSgName, p.phSgDbId, 
			 l.SegmentID AS SgId, l.SegmentName AS SgName, l.DBId AS SgDbId,
			 p.Lvl + 1
	    FROM dbo.IMSDBSegments l
		    INNER JOIN sgm p ON p.phSgId = l.SourceSegId
	    WHERE p.Lvl < 1 -- we can change the level of imbrication
	  )
	  --SELECT * FROM sgm


	  SELECT phDBId, phDBName, phSgID, phSgName, 
		    lDbId,  lDBName,  lSgId, lSgName,
		    StatementTypeDescription, ProgramName, COUNT(OccurID) AS Occ, ProgramID, PathStr
	  FROM
		 (
		  SELECT inp.phSgDbId AS phDBId,
			    db1.DBName AS phDBName,
			    inp.phSgID,
			    inp.phSgName, 
			    CASE WHEN(inp.SgDbId = inp.phSgDbId) THEN NULL
				    ELSE inp.SgDbId
			    END AS lDbId,
			    CASE WHEN(inp.SgDbId = inp.phSgDbId) THEN NULL
				    ELSE db2.DBName
			    END AS lDBName,
			    CASE WHEN(inp.SgId = inp.phSgId) THEN NULL
				    ELSE inp.SgId
			    END AS lSgId,
			    CASE WHEN(inp.SgId = inp.phSgId) THEN NULL
				   ELSE inp.SgName
			    END AS lSgName,
			    st.Description AS StatementTypeDescription,
			    ProgramAliases.AliasName AS ProgramName,
			    os.OccurID, ProgramAliases.ProgramID, Paths.PathStr
		   FROM ( -- remove duplicates if exists
				    SELECT phSgId, phSgName, phSgDbId, SgId, SgName, SgDbId
				    FROM sgm
				    GROUP BY phSgId, phSgName, phSgDbId, SgId, SgName, SgDbId
				) inp
					 INNER JOIN dbo.IMSDBInfo db1 ON db1.DBId = inp.phSgDbId
					 INNER JOIN dbo.IMSDBInfo db2 ON db2.DBId = inp.SgDbId
					 INNER JOIN dbo.StatementReference AS sr ON sr.ResourceType = 209 AND sr.ResourceID = inp.SgId                                
					 INNER JOIN dbo.Statements st ON sr.StatementType = st.StatementType 
					 INNER JOIN dbo.OccurrencesStmt AS os ON os.OccurID = sr.OccurID
					 INNER JOIN dbo.ProgramAliases ON ProgramAliases.ProgramID = os.ProgID and ProgramAliases.AliasType = 0
					 INNER JOIN Programs on Programs.ProgramID = ProgramAliases.ProgramId
					 LEFT JOIN ( SELECT 1 AS Flag, p1.ProgramName, p1.ProgramTypeID	FROM  Programs p1
						GROUP BY p1.ProgramName, p1.ProgramTypeID 	  HAVING COUNT(*) > 1) f 
							on Programs.ProgramName = f.ProgramName and Programs.ProgramTypeID = f.ProgramTypeID
					LEFT JOIN Occurrences on Programs.OccurID = Occurrences.OccurID
					LEFT JOIN dbo.Paths ON Paths.PathID = Occurrences.PathID AND f.Flag = 1
     
			)s
		 GROUP BY phDBId, phDBName, phSgID, phSgName, lDbId,  lDBName,  lSgId, lSgName, ProgramID, ProgramName, StatementTypeDescription, PathStr
		 ORDER BY phDBName, phDBID, phSgName, phSgID, ProgramName, ProgramID, PathStr, StatementTypeDescription, lDBName, lDbId, lSgName, lSgId
  END