WEB форумы на jedi
[Форум] [Помощь] [Поиск] [Выйти]
Добро пожаловать, [info]User

WEB форумы на jedi [ПОИСК] [Архив до 03.2006]

Тема SQL К предыдущему сообщению На следующее сообщение Программирование

Отправил Snam в 15:36 15.05.2005[Ответить]
Есть база "Конструкции - детали", связь М:М, через третью таблицу.
В базе 3 таблицы:  "Конструкции"          "Детали"         "Третья"
Поля таблиц:         Код К                     Код Д           Код К
                           Название                Название      Код Д
                           Фио разработчика    Материал     Кол-во Д в К
                           Дата создания         Цена
                           Кто выполняет
Нужно сделать запрос, что бы результатом выводилась констуркция, стоимость которой превышает стоимость любой конструкции заданного разработчика.
Поможите люди добрые, пиво с меня :)


Отправил Nikolay в 16:14 15.05.2005[Ответить]
как обычно разбиваем задачу на подзадачи - сначала подсчитываем стоимость каждой конструкции кладет это во временную таблицу, из которой уже выбираем макс стоимость конструкции по данному разработчику. затем все объединяем в один запрос :)


Отправил Snam в 16:49 15.05.2005[Ответить]
Я не знаю, как все это реализовывать. Мне бы текстик запроса :)
Там всего-то строчек  7 примерно.


Отправил Sleep-Walker в 21:22 15.05.2005[Ответить]
снам, запрос плёвый, думать лень, покуда вечер... если очень нада стукни в асю завтра сваяю...


Отправил Patrol в 22:21 15.05.2005[Ответить]
Не надо ничего никуда разбивать :) Временные таблицы - вообще зло, правда, меньшее, чем курсоры ;)
Все действительно делается одним простым запросом типа:

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

Сорри, не проверял. Но должно работать :)


Отправил Mighty в 23:03 15.05.2005[Ответить]
SELECT K.КодК,K.ФИО, max(sum(R.Количество*D.Цена)) MaxPrice
FROM Детали D, Конструкции K, Связи R
WHERE R.КодК=K.КодК and R.КодД=D.КодД and K.ФИО like 'фио разработчика'
GROUP BY К.КодК,K.ФИО


Отправил Snam в 23:37 15.05.2005[Ответить]
Всем спасибо, завтра проверю. Так как эскуэля нет, завтра возьму :) Запрос, там где топ 1 - неверный. сразу могу сказать, так из задания видно, что возможен вариант, что будет несколько конструкций, стоимость которых будет выше, чем стоимость конструкции заданного разработчика. А в запросе уже ТОП 1, то есть выберется только первая запись. Но все равно все проверю и спасибо огромное за беспокойство. Как только, так сразу пиво всем (скажем, по баночке :)) кому не лень было подумать :)


Отправил Patrol в 00:17 16.05.2005[Ответить]
Ааа... А я что-то подумал, что вообще максимальную...
Дело в том, что там нет признака, уникально идентифицирующего разработчика (ФИО человека уникально НЕ идентифицирует)..

Тогда дейстительно, нечто похожее на то, что написал 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 пихнуть, но ни к чему, кроме повышения сложности и снижения удобочитаемости это не приведет :)



Отправил Mighty в 01:22 16.05.2005[Ответить]
:-))) с лайком  погорячился конечно :-) дурная привычка :-))


Отправил Snam в 00:14 17.05.2005[Ответить]
Спасибо :) Лучше в один селект, а то меня не поймут :)))
и ещё такую ошибку выдает :)
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


Отправил XZ в 11:18 17.05.2005[Ответить]
Агрегатную функцию (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 Конструкции.код
)

Не очень коротко.. скорее всего можно придумать более оптимальный вариант, но работать должно.


Отправил Patrol в 12:51 17.05.2005[Ответить]
Ошибку да, выдавать будет - агрегация не по всем выводимым полям, сделай как тебе нужно..
Название таблицы "Третья" - это песня :)


Отправил Snam в 22:54 17.05.2005[Ответить]
to patrol :)
Согласен, песня :) Но когда у тебя две минуты на все про все. уже не думаешь ,как таблицу назвать :)


Отправил Patrol в 23:25 17.05.2005[Ответить]
Чего думать-то.. Это много лет назад уже придумано за тебя :)
Основная мысль - ясность, чтобы глядя на имя сразу понять о чем идет речь :) А то, если вдруг добавится еще таблица инструментов, с помощью которых собираются конструкции, таблицу связей "Четвертая" назовешь, чтоли? ;)

Согласно общепринятому именованию это звучало бы примерно так:
Constructions, Details, ConstructionDetails
:)


Отправил Snam в 00:06 18.05.2005[Ответить]
To ZX
Ваш запрос не работает :) Точнее работает, но как-то неправильно :) Он не то ,что нужно выводит! :)
Если есть время и возможность - просьба приудмать так, что бы работало :) Сам тоде думаю, никак не получается.


Отправил Patrol в 11:26 18.05.2005[Ответить]
Говорю же, не проверял.. Мелкие ошибки поправить и сам бы смог.. ;)

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

--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
)



Отправил CAHbKA в 12:17 18.05.2005[Ответить]
этот запрос выдаст "самую дорогую поделку Васи" ?


Отправил Patrol в 13:12 18.05.2005[Ответить]
Этот запрос выдает все поделки, стоимость которых превышает самую дорогую поделку Вами.

Ордер по алиасам сработает, конечно. Собственно, он и сработал - я этот запрос сразу в Query Analyser'e писал.


Отправил CAHbKA в 13:20 18.05.2005[Ответить]
я тоже проверил, но сомневался :)

"констуркция, стоимость которой превышает стоимость любой конструкции заданного разработчика."
т.е. речь идёт не о самой дорогой констукции заданного разработчика?


Отправил Snam в 16:21 18.05.2005[Ответить]
Все! Всем СПАСИБА :)
Патролу и Майти на какой-нить сисопке от меня пиво :) Если надо раньше, то напишите на почту, решим этот вопрос :)
Патролу вообще отдельное thanks :)


Отправил Patrol в 17:19 18.05.2005[Ответить]
>>.е. речь идёт не о самой дорогой констукции заданного разработчика?
Сначала я тоже так подумал (и таков был мой первый запрос), но оказалось, что нет :)

Пожалуйста :) Пива мне не надо ;)