Я новичок в разработке SQL, и мне нужно сделать UNION на двух операциях select. Ниже приведен пример запроса. Таблицы объединения & условий, где критерии, имена столбцов и все одинаковы в обоих операторах выбора, кроме первичных таблиц после предложения FROM. Я просто хотел знать, есть ли способ иметь один статический запрос выбора, вместо повторения одного и того же запроса дважды для UNION (без перехода на динамический запрос).SQL Server - UNION ALL
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
ОК ... То, что я писал ранее был пример запроса, и я обновил образец моего фактического запроса, чтобы сделать его более ясным. Это только основные таблицы, которые разные. Мое требование состоит в том, что после выполнения UNION ALL мне нужно суммировать агрегатные столбцы в конечном результате, группируя ProgramId.
В обоих запросах нет разницы, так почему вы используете 'union'? – RubahMalam
@RubahMalam, потому что основная таблица отличается – Lamak
Ahh, извините, я ее не видел .. – RubahMalam