Вы не можете использовать псевдонимы или агрегировать, используя выражения из предложения SELECT где-либо, кроме HAVING и ORDER BY *; вам нужно сделать первую «часть» подзапросом, а затем присоединиться к ней.
Возможно, это будет легче понять, хотя и немного упрощенно и не совсем правильно, если вы посмотрите на это так, как далеко идет порядок оценки ...
- ОТ (Примечание: ПРИСОЕДИНИТЬСЯ только к ОТ)
- ГДЕ
- GROUP BY
- ВЫБРАТЬ
- ЕСТЬ
- ЗАКАЗАТЬ НА
В реальной реализации, «под капотом», большинство реализаций SQL фактически используют информацию из каждого раздела для оптимизации других разделов (как, например, использование некоторых условий для сокращения записей, СОЕДИНЕННЫХ в СО); но это концептуальный порядок, которому необходимо следовать.
* В некоторых версиях MSSQL нельзя использовать псевдонимы из SELECT в HAVING или ORDER BY.
Ваш запрос должен выглядеть примерно так:
SELECT s.*
, `cil`.`Text` as `Contracted_Text`
FROM (
SELECT `iv`.`ContractId` as `Contract`
, `iv`.`site` as `SiteID`
, SUM(`iv`.`value`) as `Contract_For`
FROM items_value AS iv
WHERE `iv`.`ContractID`='2'
) AS s
LEFT JOIN contractitemlists AS cil ON `s`.`Contract_For` = cil.`Ref`
;
Но, как уже упоминали другие, отсутствие GROUP BY - это то, на что нужно обратить внимание; как в «что, если существует несколько значений сайта».