2015-05-08 52 views
0

在執行我的查詢子查詢聚合函數

不能對包含 聚合或子查詢的表達式執行聚合函數,我得到一個錯誤。

代碼:

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 

SUMSELECT不像一個在HAVING那麼重要,因此,如果有人可以幫助我,即使沒有在SELECTSUM(...)這將是有益的。

+0

由於T-SQL沒有數組,那是你必須有一個非常嚴重命名功能。 –

回答

2

我認爲將子查詢移動到from子句會更好。根據你的邏輯,你正在尋找join s,而不是left join s - 畢竟,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;