SQL-запрос: присоединение к SUM () - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь выполнить запрос, который суммирует значения элементов, а затем СОЕДИНЯЕТСЯ к значению этой суммы.

Итак, в приведенном ниже коде я пытаюсь присоединиться к 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

».

1 Ответ

0 голосов
/ 29 августа 2018

Вы не можете использовать псевдонимы или агрегировать, используя выражения из предложения 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 - это то, на что нужно обратить внимание; как в «что, если существует несколько значений сайта».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...