带有 SUM(CASE SUBQUERY) 的子查询聚合函数
Subquery aggregate function with SUM(CASE SUBQUERY)
我在执行查询时遇到错误
Cannot perform an aggregate function on an expression containing an
aggregate or a subquery.
代码:
SELECT
S.id,
SUM(CASE WHEN sc.coverage IN (SELECT number FROM ArrayOfIntegersFromString(@dynamicData)) THEN 1 ELSE 0 END) as sm
FROM
Storefronts s
LEFT JOIN StorefrontCoverages sc ON s.id = sc.storefront
LEFT JOIN Vendors v ON s.vendor = v.Id
WHERE
(
v.active = 1
AND
s.approved = 1
AND
s.status = 1
)
GROUP BY S.id
HAVING SUM(CASE WHEN sc.coverage IN (SELECT number FROM ArrayOfIntegersFromString(@dynamicData)) THEN 1 ELSE 0 END) > 0
ORDER BY sm desc
SELECT
中的 SUM
不如 HAVING
中的重要] 会有帮助。
我认为将子查询移至from
子句会更好。根据您的逻辑,您正在寻找 join
,而不是 left join
——毕竟,having
子句只是在寻找任何匹配项。
我认为以下查询可以满足您的要求:
SELECT S.id, COUNT(dd.number) as sm
FROM Storefronts s JOIN
StorefrontCoverages sc
ON s.id = sc.storefront JOIN
(SELECT number FROM ArrayOfIntegersFromString(@dynamicData)
) dd(number)
ON sc.coverage = dd.number
WHERE s.approved = 1 AND s.status = 1 AND
EXISTS (SELECT 1
FROM Vendors v
WHERE s.vendor = v.Id AND
v.active = 1
)
GROUP BY S.id
ORDER BY sm desc;
我在执行查询时遇到错误
Cannot perform an aggregate function on an expression containing an aggregate or a subquery.
代码:
SELECT
S.id,
SUM(CASE WHEN sc.coverage IN (SELECT number FROM ArrayOfIntegersFromString(@dynamicData)) THEN 1 ELSE 0 END) as sm
FROM
Storefronts s
LEFT JOIN StorefrontCoverages sc ON s.id = sc.storefront
LEFT JOIN Vendors v ON s.vendor = v.Id
WHERE
(
v.active = 1
AND
s.approved = 1
AND
s.status = 1
)
GROUP BY S.id
HAVING SUM(CASE WHEN sc.coverage IN (SELECT number FROM ArrayOfIntegersFromString(@dynamicData)) THEN 1 ELSE 0 END) > 0
ORDER BY sm desc
SELECT
中的 SUM
不如 HAVING
中的重要] 会有帮助。
我认为将子查询移至from
子句会更好。根据您的逻辑,您正在寻找 join
,而不是 left join
——毕竟,having
子句只是在寻找任何匹配项。
我认为以下查询可以满足您的要求:
SELECT S.id, COUNT(dd.number) as sm
FROM Storefronts s JOIN
StorefrontCoverages sc
ON s.id = sc.storefront JOIN
(SELECT number FROM ArrayOfIntegersFromString(@dynamicData)
) dd(number)
ON sc.coverage = dd.number
WHERE s.approved = 1 AND s.status = 1 AND
EXISTS (SELECT 1
FROM Vendors v
WHERE s.vendor = v.Id AND
v.active = 1
)
GROUP BY S.id
ORDER BY sm desc;