Search code examples
sqlsql-servercorrelated-subquery

How to get rid of these co-related sub queries from select statement


Here I am dealing with only one table, It has an attribute called CmpltStscd where for each value I need a different column in the output as an aggregate function.

Is there a way to get rid of these subqueries ?

Trying a lot

Select 
      Mg.RsrcId
    , Count(Mg.ActID) Num_of_Goals
    , (SELECT COUNT(MC.ActID) FROM TM.MatrixGoal MC where MC.CmpltStsCd = 2 AND MG.RsrcID = MC.RsrcID AND MC.ActiveFlg = 1 AND MC.DelFlg = 0 AND MC.CorporateGoalFlg <> 1 AND MC.StsCd in (3,4)) as Complete
    , (SELECT COUNT(MI.ActID) FROM TM.MatrixGoal MI where MI.CmpltStsCd = 4 AND MG.RsrcID = MI.RsrcID AND MI.ActiveFlg = 1 AND MI.DelFlg = 0 AND MI.CorporateGoalFlg <> 1 AND MI.StsCd in (3,4)) as Issues
    , (SELECT COUNT(MO.ActID) FROM TM.MatrixGoal MO where MO.CmpltStsCd = 1 AND MG.RsrcID = MO.RsrcID AND MO.ActiveFlg = 1 AND MO.DelFlg = 0 AND MO.CorporateGoalFlg <> 1 AND MO.StsCd in (3,4)) as OnTrack
From 
TM.MatrixGoal AS Mg

Where MG.ActiveFlg = 1
            AND MG.DelFlg = 0
            AND MG.CorporateGoalFlg <> 1
            AND MG.StsCd in (3,4)
Group By RsrcId

Solution

  • You need a pivot/cross tab query

    SELECT Mg.RsrcId,
           COUNT(Mg.ActID) Num_of_Goals,
           SUM(CASE
                 WHEN CmpltStsCd = 2 THEN 1
                 ELSE 0
               END)        AS Complete,
           SUM(CASE
                 WHEN CmpltStsCd = 4 THEN 1
                 ELSE 0
               END)        AS Issues,
           SUM(CASE
                 WHEN CmpltStsCd = 1 THEN 1
                 ELSE 0
               END)        AS OnTrack
    FROM   TM.MatrixGoal AS Mg
    WHERE  MG.ActiveFlg = 1
           AND MG.DelFlg = 0
           AND MG.CorporateGoalFlg <> 1
           AND MG.StsCd IN ( 3, 4 )
    GROUP  BY RsrcId