[Форум] [Помощь] [Поиск] [Выйти] |
Добро пожаловать, User |
|
|
| ||
Есть база "Конструкции - детали", связь М:М, через третью таблицу. В базе 3 таблицы: "Конструкции" "Детали" "Третья" Поля таблиц: Код К Код Д Код К Название Название Код Д Фио разработчика Материал Кол-во Д в К Дата создания Цена Кто выполняет Нужно сделать запрос, что бы результатом выводилась констуркция, стоимость которой превышает стоимость любой конструкции заданного разработчика. Поможите люди добрые, пиво с меня :) |
| ||
как обычно разбиваем задачу на подзадачи - сначала подсчитываем стоимость каждой конструкции кладет это во временную таблицу, из которой уже выбираем макс стоимость конструкции по данному разработчику. затем все объединяем в один запрос :) |
| ||
Я не знаю, как все это реализовывать. Мне бы текстик запроса :) Там всего-то строчек 7 примерно. |
| ||
снам, запрос плёвый, думать лень, покуда вечер... если очень нада стукни в асю завтра сваяю... |
| ||
Не надо ничего никуда разбивать :) Временные таблицы - вообще зло, правда, меньшее, чем курсоры ;) Все действительно делается одним простым запросом типа: SELECT TOP 1 K.КодК, sum(R.Количество*D.Цена) as Price FROM Детали D, Конструкции K, Связи R WHERE R.КодК=K.КодК and R.КодД=D.КодД GROUP BY К.КодК ORDER BY Price Desc Сорри, не проверял. Но должно работать :) |
| ||
SELECT K.КодК,K.ФИО, max(sum(R.Количество*D.Цена)) MaxPrice FROM Детали D, Конструкции K, Связи R WHERE R.КодК=K.КодК and R.КодД=D.КодД and K.ФИО like 'фио разработчика' GROUP BY К.КодК,K.ФИО |
| ||
Всем спасибо, завтра проверю. Так как эскуэля нет, завтра возьму :) Запрос, там где топ 1 - неверный. сразу могу сказать, так из задания видно, что возможен вариант, что будет несколько конструкций, стоимость которых будет выше, чем стоимость конструкции заданного разработчика. А в запросе уже ТОП 1, то есть выберется только первая запись. Но все равно все проверю и спасибо огромное за беспокойство. Как только, так сразу пиво всем (скажем, по баночке :)) кому не лень было подумать :) |
| ||
Ааа... А я что-то подумал, что вообще максимальную... Дело в том, что там нет признака, уникально идентифицирующего разработчика (ФИО человека уникально НЕ идентифицирует).. Тогда дейстительно, нечто похожее на то, что написал Mighty... За исключением, может быть, LIKE... Ибо ФИО и так не признак, а если еще и LIKE... :) Ну и все же список превышающих добавить, а то оно сейчас только максимально оцененную конструкцию разработчика выдаст.. Может так? declare @max int --Calculate the max construction price for the employee SELECT @max = max(sum(R.Количество*D.Цена)) MaxPrice FROM Детали D, Конструкции K, Связи R WHERE R.КодК=K.КодК and R.КодД=D.КодД and K.ФИО = 'фио разработчика' GROUP BY К.КодК --Pribt all constructions which price > @max SELECT K.* FROM Детали D, Конструкции K, Связи R WHERE R.КодК=K.КодК and R.КодД=D.КодД GROUP BY К.КодК HAVING sum(R.Количество*D.Цена) > @max Можно все в один select пихнуть, но ни к чему, кроме повышения сложности и снижения удобочитаемости это не приведет :) |
| ||
:-))) с лайком погорячился конечно :-) дурная привычка :-)) |
| ||
Спасибо :) Лучше в один селект, а то меня не поймут :))) и ещё такую ошибку выдает :) Server: Msg 130, Level 15, State 1, Line 3 Cannot perform an aggregate function on an expression containing an aggregate or a subquery. Скорее всего ругается на то, что используется сразу max и sum, но не уверен. вот текст моего, уже сделанного конкретно под БД. declare @max int --Calculate the max construction price for the employee SELECT @max = max(sum(Третья.Количество*Детали.цена)) as [MaxPrice] FROM Детали , Конструкции , Третья WHERE Третья.[код конструкции]=Конструкции.код and Третья.Код_Детали=Детали.Код_детали and Конструкции.[ФИО разработчика] = 'ФИО' GROUP BY Конструкции.код --Print all constructions which price > @max SELECT Kонструкции.* FROM Детали , Конструкции , Третья WHERE Третья.[код конструкции]=Kонструкции.код and Третья.Код_Детали=Детали.Код_детали GROUP BY Конструкции.код HAVING sum(Третья.Количество*Детали.цена) > @max |
| ||
Агрегатную функцию (max) от агрегатной функции (sum) брать действительно нельзя. Попробуй использовать having. Вот так к примеру: declare @max int --Calculate the max construction price for the employee SELECT [Конструкции].[КодК], [Конструкции].[Название], sum(Третья.Количество*Детали.цена) as [MaxPricePrice] FROM Детали , Конструкции , Третья WHERE Третья.[код конструкции]=Конструкции.код and Третья.Код_Детали=Детали.Код_детали and Конструкции.[ФИО разработчика] = 'ФИО' GROUP BY Конструкции.код,[Конструкции].[Название] HAVING sum(Третья.Количество*Детали.цена) >= ALL( SELECT sum(Третья.Количество*Детали.цена) FROM Детали , Конструкции , Третья WHERE Третья.[код конструкции]=Конструкции.код and Третья.Код_Детали=Детали.Код_детали and Конструкции.[ФИО разработчика] = 'ФИО' GROUP BY Конструкции.код ) Не очень коротко.. скорее всего можно придумать более оптимальный вариант, но работать должно. |
| ||
Ошибку да, выдавать будет - агрегация не по всем выводимым полям, сделай как тебе нужно.. Название таблицы "Третья" - это песня :) |
| ||
to patrol :) Согласен, песня :) Но когда у тебя две минуты на все про все. уже не думаешь ,как таблицу назвать :) |
| ||
Чего думать-то.. Это много лет назад уже придумано за тебя :) Основная мысль - ясность, чтобы глядя на имя сразу понять о чем идет речь :) А то, если вдруг добавится еще таблица инструментов, с помощью которых собираются конструкции, таблицу связей "Четвертая" назовешь, чтоли? ;) Согласно общепринятому именованию это звучало бы примерно так: Constructions, Details, ConstructionDetails :) |
| ||
To ZX Ваш запрос не работает :) Точнее работает, но как-то неправильно :) Он не то ,что нужно выводит! :) Если есть время и возможность - просьба приудмать так, что бы работало :) Сам тоде думаю, никак не получается. |
| ||
Говорю же, не проверял.. Мелкие ошибки поправить и сам бы смог.. ;) Вот запрос, выдающий список идентификаторов интересующих тебя конструкций. Если идентификаторов мало, дорисуй список выводимых значений и поправь агрегацию: --Pribt all constructions which price > @max SELECT C.Id FROM Details D, Constructions C, ConstructionDetails R WHERE R.ConstructionId=C.Id and R.DetailId=D.Id GROUP BY C.Id HAVING sum(R.Qty*D.Price) >= ( --Calculate the max construction price for the employee SELECT top 1 sum(R.Qty*D.Price) MaxPrice FROM Details D, Constructions C, ConstructionDetails R WHERE R.ConstructionId=C.Id and R.DetailId=D.Id and C.fio = 'name' group by C.id order by MaxPrice desc ) |
| ||
этот запрос выдаст "самую дорогую поделку Васи" ? |
| ||
Этот запрос выдает все поделки, стоимость которых превышает самую дорогую поделку Вами. Ордер по алиасам сработает, конечно. Собственно, он и сработал - я этот запрос сразу в Query Analyser'e писал. |
| ||
я тоже проверил, но сомневался :) "констуркция, стоимость которой превышает стоимость любой конструкции заданного разработчика." т.е. речь идёт не о самой дорогой констукции заданного разработчика? |
| ||
Все! Всем СПАСИБА :) Патролу и Майти на какой-нить сисопке от меня пиво :) Если надо раньше, то напишите на почту, решим этот вопрос :) Патролу вообще отдельное thanks :) |
| ||
>>.е. речь идёт не о самой дорогой констукции заданного разработчика? Сначала я тоже так подумал (и таков был мой первый запрос), но оказалось, что нет :) Пожалуйста :) Пива мне не надо ;) |