2015-05-08 2 views
0

Я получаю сообщение об ошибке при выполнении моего запросаSubquery агрегатной функция с SUM (CASE подзапросом)

Невозможно выполнить агрегатную функцию выражения, содержащее агрегата или подзапрос.

Код:

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 

SUM в SELECT не так важно, как тот, в HAVING, так что если кто-то может помочь мне даже без этого SUM(...) в SELECT было бы полезно.

+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; 
Смежные вопросы