Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 05.04.2015
Сообщений: 22

Выборка с Max() почему-то выводит несколько значений

26.04.2015, 18:19. Показов 5414. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Есть 2 таблицы - склад и поставщики, связанные по полю id_manuf.



Дали задание без использования курсоров подсчитать налог на продажу каждого товара по правилу

SQL
1
IIF(price*amount>1000000,price*amount*0.20,price*amount*0.13)
и просуммировать налоги на товары каждого из вендоров.

В конце вывести вендора, у которого больше всего суммарный налог на все товары, которые он поставляет, так, чтобы было 2 поля - имя этого вендора и его суммарный налог на все продаваемые им товары.

Что я написал:
SQL
1
2
3
4
5
SELECT Manufactures.Name, MAX(MaxNal) AS SumNal
FROM ((SELECT Warehouse.ID_manuf, SUM(IIF(price*amount>1000000,price*amount*0.20,price*amount*0.13)) AS MaxNal FROM Warehouse GROUP BY ID_manuf))a
INNER JOIN Manufactures 
ON a.ID_manuf = Manufactures.ID_MANUF
GROUP BY Manufactures.Name, a.MaxNal
Задание оно, в принципе, выполняет, но почему-то выводит суммарные налоги всех вендоров, а не только одного.


В то же время, если изменить запрос и делать выборку только по Max(MaxNal), я получаю одну максимальную цифру налога. То, что нужно, только без имени вендора

SQL
1
2
3
4
SELECT MAX(MaxNal) AS SumNal
FROM ((SELECT Warehouse.ID_manuf, SUM(IIF(price*amount>1000000,price*amount*0.20,price*amount*0.13)) AS MaxNal FROM Warehouse GROUP BY ID_manuf))a
INNER JOIN Manufactures 
ON a.ID_manuf = Manufactures.ID_MANUF


Уже 2 час пытаюсь как-то выйти из положения, чтобы появлялось поле с именем поставщика, но ничего не прокатывает.

Помогите советом, может, есть какая-то хитрая структура запроса, которая решит мою задачу?
Миниатюры
Выборка с Max() почему-то выводит несколько значений   Выборка с Max() почему-то выводит несколько значений   Выборка с Max() почему-то выводит несколько значений  

Изображения
 
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.04.2015, 18:19
Ответы с готовыми решениями:

Почему вместо нужных значений программа выводит несколько раз -6.227744e+66?
считываю матрицу чисел из файла double bufDownloadVector; std::ifstream stream("C:\\Users\\...\\dollar.txt"); ...

Выборка из поля имеющее несколько значений
Всем привет. В таблице есть поле типа int(10) по мере того как запись проходит через этапы, значение этого поля может меняться с 1...

Почему while выводит 1 значение а не несколько ?
Подскажите почему while выводит 1 значение? void __fastcall TForm1::Button1Click(TObject *Sender) { double x=0.5; //начальное...

9
349 / 262 / 65
Регистрация: 07.04.2014
Сообщений: 1,603
26.04.2015, 18:22
Цитата Сообщение от crr Посмотреть сообщение
Задание оно, в принципе, выполняет, но почему-то выводит суммарные налоги всех вендоров, а не только одного.
Нет отбора по условию. Используйте having.
0
0 / 0 / 0
Регистрация: 05.04.2015
Сообщений: 22
26.04.2015, 18:37  [ТС]
Streletz, но ведь условие Max(MaxNal) в селекте, и по идее он должен выводить максимальное значение среди всех, посчитанных во вложенном запросе в from,
где As MaxNal считаем.
Тогда, может, подскажете, как в having правильно сформировать условие?
SQL
1
HAVING MAX(MaxNal) = (SELECT SUM(IIF(price*amount>1000000,price*amount*0.20,price*amount*0.13)) FROM Warehouse)
Вообще ничего не выводит, два пустых поля...
0
349 / 262 / 65
Регистрация: 07.04.2014
Сообщений: 1,603
26.04.2015, 18:52
Цитата Сообщение от crr Посмотреть сообщение
но ведь условие Max(MaxNal) в селекте, и по идее он должен выводить максимальное значение среди всех, посчитанных во вложенном запросе в from,
У Вас ещё группировка (group by) по вендорам. Поэтому max отрабатывает только для каждого вендора по отдельности.
Цитата Сообщение от crr Посмотреть сообщение
как в having правильно сформировать условие
Небольшой пример был по ссылке из моего предыдущего поста. На всякий случай более развёрнутый вариант можно увидеть здесь
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
26.04.2015, 19:04
Лучший ответ Сообщение было отмечено crr как решение

Решение

T-SQL
1
2
3
4
5
6
7
8
SELECT top (1)
 m.Name, MAX(a.MaxNal) AS SumNal
FROM 
 (SELECT Warehouse.ID_manuf, SUM(IIF(price*amount>1000000,price*amount*0.20,price*amount*0.13)) AS MaxNal FROM Warehouse GROUP BY ID_manuf) a
INNER JOIN Manufactures m
ON a.ID_manuf = m.ID_MANUF
order by
 row_number() over (order by a.MaxNal desc)
0
0 / 0 / 0
Регистрация: 05.04.2015
Сообщений: 22
26.04.2015, 19:22  [ТС]
Streletz, оказалось, что как раз условие я формирую правильно. Может, тогда задаю неверно?

invm, спасибо за альтернативный вариант, что-то новое, но, увы, сыпет уже знакомую мне ошибку
Msg 8120, Level 16, State 1, Line 2
Column 'Manufactures.Name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

То есть ему нужен Group By, с которым получается не то, что мне нужно.
Может, есть ещё варианты? Я реально уже не знаю что и пробовать. С курсором сделал, но препод требует без.
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
26.04.2015, 19:31
Цитата Сообщение от crr Посмотреть сообщение
nvm, спасибо за альтернативный вариант, что-то новое, но, увы, сыпет уже знакомую мне ошибку
Msg 8120, Level 16, State 1, Line 2
Column 'Manufactures.Name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Мой запрос не может давать такую ошибку.
0
0 / 0 / 0
Регистрация: 05.04.2015
Сообщений: 22
26.04.2015, 19:44  [ТС]
invm, вот ошибка. Я вообще запрос туда пишу? Но другие же как-то работают...

Попутно уточню, правильно ли я понял смысл Вашего варианта - выбрать только самый верхний из множественной выборки сделанной по убыванию, и таким образом оставить вариант с самым большим налогом? Классная идея пост-фильтрации)

С SQL Server знаком 2 дня просто
Миниатюры
Выборка с Max() почему-то выводит несколько значений  
0
0 / 0 / 0
Регистрация: 05.04.2015
Сообщений: 22
26.04.2015, 19:51  [ТС]
invm, аее, решил, спасибо вам!

Достаточно было выводить одну запись!

T-SQL
1
2
3
4
5
6
7
SELECT top (1)
 m.Name, MAX(a.MaxNal) AS SumNal
FROM 
 (SELECT Warehouse.ID_manuf, SUM(IIF(price*amount>1000000,price*amount*0.20,price*amount*0.13)) AS MaxNal FROM Warehouse GROUP BY ID_manuf) a
INNER JOIN Manufactures m
ON a.ID_manuf = m.ID_MANUF
GROUP BY m.Name
И всё работает, как мне надо.
Изображения
 
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
26.04.2015, 20:01
Цитата Сообщение от crr Посмотреть сообщение
решил,
Неправильно решили. top без order by может вывести любую запись.
Добавьте order by MAX(a.MaxNal) desc
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.04.2015, 20:01
Помогаю со студенческими работами здесь

Listbox multiselect как выводит несколько значений в один textbox
здравствуйте подскажите как сделать чтобы при выборе нескольких значений в listbox они вывелись все в одно поле textbox заранее...

Почему по запросу site:mysite.com Google выводит несколько страниц с моего сайта
Здравствуйте! Почему по запросу site:mysite.com Google выводит несколько страниц с моего сайта, а по запросу по ключевым словам, например,...

Даны векторы a и b , состоящие из семи компонентов. Найти max(max(Ai), max(Bi), max(¦Ai-Bi¦), max(Ai+Bі),1)
Даны векторы a и b , состоящие из семи компонентов. Найти max(max(Ai), max(Bi), max(¦Ai-Bi¦), max(Ai+Bі),1).

Функция должна выводить несколько значений, но выводить только одно. Почему?
Здравствуйте! Мне нужно создать рекурсивную функцию, которая выводит на экран все простые множители числа n (единицу не учитывать) в...

Получение уникальных значений поля (GROUP BY) и min/max значений других полей
Доброго времени суток. Есть таблица из 4 полей: id | article | price | enabled id - уникальный AI, остальные - обычные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru