SQL-запрос: присоединение к SUM ()

Я пытаюсь запустить запрос, который суммирует значение элементов, а затем присоединяется к значению этой СУММЫ.

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

Эта точка с запятой в предпоследней строке выглядит не очень хорошо. А агрегатная функция без предложения GROUP BY немного странная (но не невозможная)

Strawberry 29.08.2018 18:38
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
1
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете использовать псевдонимы или агрегировать выражения из предложения SELECT где угодно, кроме HAVING и ORDER BY *; вам нужно сделать первую «часть» подзапросом, а затем присоединиться к нему.

Возможно, будет легче понять, хотя и несколько упрощенно и не совсем правильно, если вы посмотрите на это с точки зрения порядка оценки ...

  • ОТ (Примечание: JOIN только в пределах FROM)
  • КУДА
  • ГРУППА ПО
  • ВЫБРАТЬ
  • ИМЕЮЩИЕ
  • СОРТИРОВАТЬ ПО

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

ЭТО НЕ ПОРЯДОК ОЦЕНКИ! Это порядок, используемый для определения идентификаторов в запросе. Очень, очень важно понимать разницу между областью видимости и исполнением.

Gordon Linoff 29.08.2018 19:20

@GordonLinoff Отредактировано, чтобы сделать мое намерение «вроде как это, но не совсем» более очевидным; Я думал, что достаточно хорошо прикрыл это разделом «под капотом», но, видимо, нет.

Uueerdo 29.08.2018 19:25

@Uueerdo Большое спасибо, я посмотрю и посмотрю, что я могу сделать. В этом случае каждый контракт предназначен для сайта, поэтому они должны иметь паритет 1: 1.

Peter Collins 30.08.2018 10:16

Да, если они 1: 1, это не проблема (кроме конфигурации по умолчанию в новых версиях MySQL, которая немного строже в требованиях GROUP BY).

Uueerdo 30.08.2018 21:39

Другие вопросы по теме