Как правильно сформировать SQL запрос
От: slz Россия  
Дата: 21.08.03 06:52
Оценка:
Здравствуйте.

Неодходима получить агрегатную функцию от другой агркгатной функции, как лучше сделать?

Т.е. для примера таблица товаров:

Наименование
Кол-во

Надо найти какого наименования продано больше.

В результате запроса должна вернуться запись (или несколько с одинакой суммой по кол-ву) для определенного наименования.

Т.е. надо получить MAX(SUM(кол-во)) GROUP BY наименование.

Как реализовать такой запрос на SQL?

Заранее благодарен.
Re: Как правильно сформировать SQL запрос
От: Romkin  
Дата: 21.08.03 07:20
Оценка:
slz>Неодходима получить агрегатную функцию от другой агркгатной функции, как лучше сделать?

slz>Т.е. для примера таблица товаров:


slz>Наименование

slz>Кол-во

slz>Надо найти какого наименования продано больше.


slz>В результате запроса должна вернуться запись (или несколько с одинакой суммой по кол-ву) для определенного наименования.


slz>Т.е. надо получить MAX(SUM(кол-во)) GROUP BY наименование.


slz>Как реализовать такой запрос на SQL?


Интересная задачка, кстати.
 select t1.i, sum(t1.i1) 
from t1 
group by t1.i 
having sum(t1.i1) >= all (select sum(t2.i1)  
                                  from t1 as t2  
                                  group by t2.i 
                                 )

что-то вроде этого
Re[2]: Как правильно сформировать SQL запрос
От: slz Россия  
Дата: 21.08.03 07:39
Оценка:
Здравствуйте, Romkin, Вы писали:

slz>>Неодходима получить агрегатную функцию от другой агркгатной функции, как лучше сделать?


slz>>Т.е. для примера таблица товаров:


slz>>Наименование

slz>>Кол-во

slz>>Надо найти какого наименования продано больше.


slz>>В результате запроса должна вернуться запись (или несколько с одинакой суммой по кол-ву) для определенного наименования.


slz>>Т.е. надо получить MAX(SUM(кол-во)) GROUP BY наименование.


slz>>Как реализовать такой запрос на SQL?


R>Интересная задачка, кстати.

R>
 select t1.i, sum(t1.i1) 
R>from t1 
R>group by t1.i 
R>having sum(t1.i1) >= all (select sum(t2.i1)  
R>                                  from t1 as t2  
R>                                  group by t2.i 
R>                                 ) 

R>

R>что-то вроде этого

А в VisualFoxPro это проканает?
Я почему-то подзапрос в оператор HAVING вставить не могу. Ругается.
Re[3]: Как правильно сформировать SQL запрос
От: Romkin  
Дата: 21.08.03 08:50
Оценка: 1 (1)
slz>>>В результате запроса должна вернуться запись (или несколько с одинакой суммой по кол-ву) для определенного наименования.

slz>>>Т.е. надо получить MAX(SUM(кол-во)) GROUP BY наименование.


slz>>>Как реализовать такой запрос на SQL?


R>>Интересная задачка, кстати.

R>>
 select t1.i, sum(t1.i1) 
R>>from t1 
R>>group by t1.i 
R>>having sum(t1.i1) >= all (select sum(t2.i1)  
R>>                                  from t1 as t2  
R>>                                  group by t2.i 
R>>                                 ) 

R>>

R>>что-то вроде этого

slz>А в VisualFoxPro это проканает?

slz>Я почему-то подзапрос в оператор HAVING вставить не могу. Ругается.

Ты просил на SQL — написано в полном соответствии со стандартом. Насчет VFP ничего не скажу, просто не знаю...
Может, подойдет в стиле MSSQL?
select top 1 t1.i, sum(t1.i1) 
  from t1 
  group by t1.i 
  order by sum(t1.i1) desc

и у top есть with ties?
Re: Как правильно сформировать SQL запрос
От: VVP Россия 67524421
Дата: 21.08.03 09:23
Оценка:
Здравствуйте, slz, Вы писали:

slz>Неодходима получить агрегатную функцию от другой агркгатной функции, как лучше сделать?

Поизвращаться немножко
slz>Т.е. для примера таблица товаров:
slz>Наименование
slz>Кол-во
GOOD_MOVE (GOOD_ID integer, QNT float, DTMOVE date) — опишем структуру товародвижения: код номенклатуры, кол-во (["+" приход]/["-" расход] ), дата проводки.
slz>Надо найти какого наименования продано больше.
SELECT GM.GOOD_ID, GM.SUM_QNT
FROM (    
  SELECT GM.GOOD_ID, SUM(GM.QNT) AS SUM_QNT
  FROM GOOD_MOVE GM
  WHERE GM.DTMOVE>='01.09.2001' AND GM.DTMOVE<'03.09.2001'
    AND GM.QNT<0
  GROUP BY GM.GOOD_ID
) GM /* вернет список отгрузок по номенклатуре */, (
  SELECT MIN(R.QNT) MIN_QNT FROM (
    SELECT GM.GOOD_ID, SUM(GM.QNT) AS QNT
    FROM GOOD_MOVE GM
    WHERE GM.DTMOVE>='01.09.2001' AND GM.DTMOVE<'03.09.2001'
      AND GM.QNT<0
    GROUP BY GM.GOOD_ID
  ) R /* ищем максимум отгрузок */
) M /* возвращает максимум отгрузок для сравнения */
WHERE GM.SUM_QNT<=M.MIN_QNT

slz>В результате запроса должна вернуться запись (или несколько с одинакой суммой по кол-ву) для определенного наименования.
Вернется одна или несколько записей, которые достигли максимума отгрузок.
slz>Т.е. надо получить MAX(SUM(кол-во)) GROUP BY наименование.
slz>Как реализовать такой запрос на SQL?
Ну вот таким сложным внутренним соединением (inner join)
slz>Заранее благодарен.
Оценочками, я надеюсь.
Никогда не бойся браться делать то, что делать не умеешь. Помни, ковчег был построен любителем. Профессионалы построили Титаник...
Re[4]: Как правильно сформировать SQL запрос
От: slz Россия  
Дата: 21.08.03 09:26
Оценка:
Здравствуйте, Romkin, Вы писали:

slz>>>>В результате запроса должна вернуться запись (или несколько с одинакой суммой по кол-ву) для определенного наименования.


slz>>>>Т.е. надо получить MAX(SUM(кол-во)) GROUP BY наименование.


slz>>>>Как реализовать такой запрос на SQL?


R>>>Интересная задачка, кстати.

R>>>
 select t1.i, sum(t1.i1) 
R>>>from t1 
R>>>group by t1.i 
R>>>having sum(t1.i1) >= all (select sum(t2.i1)  
R>>>                                  from t1 as t2  
R>>>                                  group by t2.i 
R>>>                                 ) 

R>>>

R>>>что-то вроде этого

slz>>А в VisualFoxPro это проканает?

slz>>Я почему-то подзапрос в оператор HAVING вставить не могу. Ругается.

R>Ты просил на SQL — написано в полном соответствии со стандартом. Насчет VFP ничего не скажу, просто не знаю...

R>Может, подойдет в стиле MSSQL?
R>
R>select top 1 t1.i, sum(t1.i1) 

Спасибо.
R>  from t1 
R>  group by t1.i 
R>  order by sum(t1.i1) desc
R>

R>и у top есть with ties?
Re: Как правильно сформировать SQL запрос
От: vvaizh http://izh-test.sourceforge.net/
Дата: 21.08.03 09:32
Оценка:
Здравствуйте, slz, Вы писали:

slz>Как реализовать такой запрос на SQL?


BTW в стандарте SQL есть ещё такая штука как UDF
Мне кажется, в вашем случае стоит попробовать
http://izh-test.sourceforge.net/russian/introduction.html
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.