Я пытаюсь запустить запрос, который суммирует значение элементов, а затем присоединяется к значению этой СУММЫ.
Итак, в приведенном ниже коде я пытаюсь присоединиться к Contract_For, но я не уверен, возможно ли это.
SELECT `items_value`.`ContractId` as `Contract`,
`items_value`.`site` as `SiteID`,
SUM(`items_value`.`value`) as `Contract_For`,
`contractitemlists`.`Text` as `Contracted_Text`
FROM items_value
LEFT JOIN contractitemlists ON (`items_value`.`Contract_For`) = `contractitemlists`.`Ref`;
WHERE `items_value`.`ContractID`='2';
Когда я сталкивался с подобными проблемами в прошлом, я просто создавал представление, содержащее СУММ, а затем присоединялось к нему в другом представлении.
На данный момент приведенный выше образец предназначен для работы только с одним фиктивным значением, но он предназначен для хранимой процедуры, в которой пользователь выбирает ContractID. Ошибка, которую я получаю на данный момент: «Неизвестный столбец items_value.Contract_For.






Вы не можете использовать псевдонимы или агрегировать выражения из предложения SELECT где угодно, кроме HAVING и ORDER BY *; вам нужно сделать первую «часть» подзапросом, а затем присоединиться к нему.
Возможно, будет легче понять, хотя и несколько упрощенно и не совсем правильно, если вы посмотрите на это с точки зрения порядка оценки ...
В реальной реализации, «под капотом», большинство реализаций SQL фактически используют информацию из каждого раздела для оптимизации других разделов (например, использование некоторых условий where для уменьшения количества записей, JOIN, соединенных в FROM); но это концептуальный порядок, которого необходимо придерживаться.
* В некоторых версиях 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 - это то, на что следует обратить внимание; например, «что, если существует несколько значений сайта».
ЭТО НЕ ПОРЯДОК ОЦЕНКИ! Это порядок, используемый для определения идентификаторов в запросе. Очень, очень важно понимать разницу между областью видимости и исполнением.
@GordonLinoff Отредактировано, чтобы сделать мое намерение «вроде как это, но не совсем» более очевидным; Я думал, что достаточно хорошо прикрыл это разделом «под капотом», но, видимо, нет.
@Uueerdo Большое спасибо, я посмотрю и посмотрю, что я могу сделать. В этом случае каждый контракт предназначен для сайта, поэтому они должны иметь паритет 1: 1.
Да, если они 1: 1, это не проблема (кроме конфигурации по умолчанию в новых версиях MySQL, которая немного строже в требованиях GROUP BY).
Эта точка с запятой в предпоследней строке выглядит не очень хорошо. А агрегатная функция без предложения GROUP BY немного странная (но не невозможная)