SQL Server - UNION ALL

Tes*_*ser 1 sql sql-server union

我是SQL开发的新手,我需要在两个select语句上执行UNION.以下是示例查询.Join表和条件,其中条件,列名和所有内容在select语句中都是相同的,除了FROM子句之后的主表.我只是想知道是否有一种方法可以有一个静态选择查询,而不是为UNION重复两次相同的查询(不需要动态查询).

SELECT Sum(ABC.Intakes) As TotalIntakes, Sum(ABC.ClientTarget) as TotalClientTarget
FROM(

    SELECT Sum(tt.IntakesReceived) As Intakes, Sum(tt.ClientTarget) As ClientTarget, 
        tt.ProgramId 
    FROM 
        (SELECT Count(DISTINCT ClientID) As IntakesReceived,  
           DATEDIFF(MONTH, L.AwardStartDate, L.AwardEndDate)*L.MonthlyClientTarget As ClientTarget, 
           L.AwardId, L.ProgramId
        FROM IntakeCoverageLegacy As L
          LEFT JOIN UserRoleEntity URE ON URE.EntityId  = L.AwardId
          LEFT JOIN CDPUserRole UR ON URE.UserRoleId = UR.Id AND UR.CDPUserId = @UserId     
        WHERE (@Program IS NULL OR L.ProgramId IN (SELECT ProgramID FROM @ProgramIDList)
          AND (ufn_IsInternalUser(@UserId) = 1
               OR (ufn_IsInternalUser(@UserId) = 0 AND UR.CDPUserId = @UserId ))    
        GROUP BY L.AwardId, L.ProgramId) As tt  
    GROUP BY tt.ProgramId, tt.ProgramName             

 UNION ALL

    SELECT Sum(tt.IntakesReceived) As Intakes, Sum(tt.ClientTarget) As ClientTarget, 
        tt.ProgramId 
    FROM 
       (SELECT Count(DISTINCT C.ClientID) As IntakesReceived,  
         DATEDIFF(MONTH, C.AwardStartDate, C.AwardEndDate)*L.MonthlyClientTarget As ClientTarget, 
         C.AwardId, C.ProgramId
       FROM IntakeCoverageCDP As C
          LEFT JOIN UserRoleEntity URE ON URE.EntityId  = L.AwardId
          LEFT JOIN CDPUserRole UR ON URE.UserRoleId = UR.Id AND UR.CDPUserId = @UserId     
       WHERE (@Program IS NULL OR C.ProgramId IN (SELECT ProgramID FROM @ProgramIDList)
           AND (ufn_IsInternalUser(@UserId) = 1
                OR (ufn_IsInternalUser(@UserId) = 0 AND UR.CDPUserId = @UserId ))   
       GROUP BY C.AwardId, C.ProgramId) As tt   
   GROUP BY tt.ProgramId, tt.ProgramName

) As ABC
GROUP BY ABC.ProgramId
Run Code Online (Sandbox Code Playgroud)

好的...我之前发布的是一个示例查询,我已将示例更新为我的实际查询,以使其更清晰.它只是主要的表格不同.我的要求是 - 在执行UNION ALL之后,我需要在最终结果中对聚合列求和,按ProgramId进行分组.

Lam*_*mak 6

我可能会首先使用UNIONClientLegacyClient表作为派生表,然后执行JOINS:

SELECT  C.AwardId, 
        C.ProgramName, 
        COUNT(ClientId) AS Intakes 
FROM (  SELECT  AwardId,
                ProgramName,
                Id
        FROM Client 
        WHERE Id = @ClientId
        UNION 
        SELECT  AwardId,
                ProgramName,
                Id
        FROM LegacyClient
        WHERE Id = @ClientId) C
LEFT JOIN UserRoleEntity URE 
    ON C.AwardId = URE.EntityId 
LEFT JOIN UserRole UR 
    ON URE.UserRoleId = UR.Id AND UR.CDPUserId = @UserId
WHERE (testFunction(@UserId) = 0
  OR (testFunction(@UserId) <> 0 AND UR.CDPUserId = @UserId))
GROUP BY C.AwardId, 
         C.ProgramName;
Run Code Online (Sandbox Code Playgroud)