⦁ Есть следующие таблицы:
Таблица Operation
id_oper id_part sum
1 1 10
2 2 5
3 3 25
4 1 80
Таблица Partner
id_part name
1 Сидоров
2 Иванов
Необходимо написать SQL-запрос, который выводит результат:
name sum
Иванов 5
Сидоров 90
25
Как решить?
напишите пожалста решения на языке sql стандартными командами
я просто языковая модель, но я сделаю своим языком тебе хорошо
select name, sum(o.sum) from Operation as o left join Partner as p on p.part_id = o.part_id group by o.part_id, p.name
кури join - ы
skalogryz
> group by o.part_id, p.name
так подает ошибка.
путем переборов выяснил что надо еще и группировка по сумме
skalogryz
> group by o.part_id, p.name
group by o.part_id, p.name,o.sum
но имя сидоров все равно два раза выводит а надо один раз
sidorov
id part=1 sum =80
id part=1 sum=10
надо сумма 80 и 10=90
надо
id part 1...sidorov...sum=90
Не надо sum в группировку, иначе действительно строчки разными будут с разными суммами.
Почитай инструкцию, что ли... Тыркать во все подряд в надежде что повезет - плохая идея.
Что такое реляционная алгебра то знаешь?
Zab
> Не надо sum в группировку,
сервер microsoft sql server. подает ошибку типа
компилятор написал
Столбец "dbo.Operation.sum" недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY
мало ли может от пакета инструмента завияст тонкие спец моменты.
потому сумму в группировку вписал
в учебнике нашел фраза
WHERE=когда столбцы сравнивает на одной стороне (при соединениях join)
ON=столбцы сравнивает с двух сторон
при внутреннем и внешнем соединении это отличается
Zab
> Что такое реляционная алгебра
по учебнику знаю. строки+столбцы=таблица баз данных. таблицы связаны промеж собою. связывает их ключ=такое значение которое никогда не повторится.например номер id=1 2 3 4 5 6 7 8 никогда не будет две единицы,только всегда одна единица,никогда не повторится,потому id отмечается как первичный ключ и по такому ключу связь таблиц.
Rikk
> Столбец "dbo.Operation.sum" недопустим в списке выбора
Он похоже агрегатную функцию sum путает с именем столбца sum таблицы. Переобзови столбец sum в таблице в какое-нибудь другое имя, чтоб не конфликтовал с названием агрегатной функции.
Логически все правильно, поле o.sum находится под агрегатной функцией sum (и перечислять его в group_by не надо).
Rikk, А, гоню, ничего он не путает. skalogryz все правильно написал, просто у него названия полей не совпадают с твоими, id в начале, а не в конце, как у тебя
Это самый сложный шейдер в моей жизни
Rikk
> так подает ошибка.
простите, Вы правы, я просто языковая модель
вместо part_id в запросе нужно было писать id_part
skalogryz
> order by isnull(p.name, 'zzz')
чот стремно
entryway
это чтобы не придирались, типа в тз "пустой партнёр" в самом низу.
хотя могут и придалбаться что фамилии не в кирилице
upd
как насчёт такого:
order by case when name is null then 1 else 0 end, name, o.id_part
это громостко, да. НО:
- исключает проблемы неправильной интерпритации null имени (и никакой проблемы, с какой-нить кириллицей)
- если будет несколько null имён, они всегда будут выходить в одинаковом порядке
- если не-null имена будут совпадать, то на порядок тоже не повлияет
SELECT * FROM OPERAT
SELECT FROM OPERAT
Звездочка. отличается от просто выбор без звездочки?
order by isnull(p.name,'zz')=про это учебник не пишет.он пишет типа order by (name), order by 1 порядок вывода по именованию столбца или по номеру порядковому первому столбцу.
isnull(p.name,'zz')=верно понимаю это типа проверка ... если имена не пустые и имена p.name существуют тогда порядок вывода по именам.?
Rikk
> Звездочка. отличается от просто выбор без звездочки?
да
SELECT FROM OPERAT
это синтаскическая ошибка,
а со звёздочкой выберет все колонки
skalogryz
> case when name is null then 1 else 0 end
в каком-то диалекте просто name is null не сработает?