Конференция "Базы" » вложенный запрос [D7, FireBird 1.5]
 
  • Цукор5 (06.05.10 17:00) [0]
    Имею такую таблицу:
    ID -Integer (генератор)
    Num - Integer
    PayCash - Numeric(18,2)
    ... // прочие поля

    И такие данные:
    567    12    5,00
    568    12    5,00
    569    13    1,12
    570    14    9,99
    571    14    9,99
    572    14    9,99

    Задача : посчитать сумму по ячейке  PayCash без повторений.

    Сперва решил отобразить все суммы, без повторений. Сделал так:
    SELECT num, paycash  from таблица   group by num, paycash

    Получил:
    12   5,00
    13   1,12
    14   9,99

    Казалось бы, теперь просто взять сумму по ячейке и результат готов. Но, не могу.
    Подскажите, как сделать вложенный запрос вида select sum(ячейка) from (select ... from таблица). Или может можно пойти другим путем?
    Заранее спасибо.

    P.S. Про хранимые процедуры и представления знаю и могу сделать с помощью них, но нельзя.
    База стоит и работает и меня не пустят ее править.Задачу желательно решить с помощью запроса.
  • sniknik © (06.05.10 17:33) [1]
    > как сделать вложенный запрос вида select sum(ячейка) from (select ... from таблица).
    а вот именно так и делается как написал... только в основном (вложенном я бы не делал group by я бы сделал distinct все таки группировка предполагает агрегирующие функции, а у тебя их в нем нет)
    т.е.
    SELECT num, sum(ячейка) from
     (select distinct ... from таблица)
    group by num


    (орфография сохранена... х.з. может в ней что то важное)
  • turbouser © (06.05.10 17:33) [2]
    SELECT num, max(paycash)  from таблица   group by num
  • sniknik © (06.05.10 17:43) [3]
    turbouser ©   (06.05.10 17:33) [2]
    это же не сумма

    а кстати где то видел такой синтаксис, не знаю уж пойдет с FB и будет ли делать то что хочется...

    SELECT num, sum(distinct  paycash)  from таблица group by num

  • Цукор5 (06.05.10 17:45) [4]
    >а вот именно так и делается как написал

    Хм. Почему тогда получаю это:

    Invalid token.
    Dynamic SQL Error.
    SQL error code = -104.
    Token unknown - line 2, char 3.
    select.



    Да и разве можно подобное делать в FireBird 1.5?
  • Sergey13 © (06.05.10 17:46) [5]
    > [0] Цукор5   (06.05.10 17:00)

    > как сделать вложенный запрос вида select sum(ячейка) from
    > (select ... from таблица).

    Так в ФБ вроде как нельзя.
    Но можно попробовать так

    SELECT num, sum(paycash)  
    from таблица t1  
    where id=(select max(id) from таблица t2 where t2.num=t1.num)
    group by num



    > ... // прочие поля
    > И такие данные:
    > 567    12    5,00
    > 568    12    5,00
    > 569    13    1,12
    > 570    14    9,99
    > 571    14    9,99
    > 572    14    9,99

    Такие данные ВОЗМОЖНО говорят о том, что нормализация БД хромает и надо подумать о выводе указанных данных в отдельную таблицу.
  • Цукор5 (06.05.10 17:47) [6]
    >sniknik ©  

    И еще одно уточнение. Мне нужна сумма. Т.е одно число. В Ваших запросах я буду иметь опять  много записей, но никак не сумму.
  • Цукор5 (06.05.10 17:50) [7]
    Пардон, можен написал как-то непонятно.
    Задача отобразить сумму. Т.е. 5+1,12+9,99 = 16,11
  • Sergey13 © (06.05.10 17:56) [8]
    > [7] Цукор5   (06.05.10 17:50)

    SELECT sum(paycash)  
    from таблица t1  
    where id=(select max(id) from таблица t2 where t2.num=t1.num)
  • Цукор5 (06.05.10 18:00) [9]
    2 Sergey13 ©   (06.05.10 17:56) [8]

    Спасибо. Работает, но ОЧЕНЬ долго считает.
    Видать прийдется создать ХП и там считать.
  • turbouser © (06.05.10 18:00) [10]
    ясно :) не так понял ТС :)
    sum(distinct

    должно помочь
  • Цукор5 (06.05.10 18:04) [11]
    2 turbouser ©   (06.05.10 18:00) [10]
    > sum(distinct должно помочь

    Как он может помочь?
    А если у меня такие данные будут:

    567    12    5,00
    568    12    5,00
    569    13    5,00
    570    14    9,99
    571    14    9,99
    572    14    9,99

    Правильная сумма будет 5+5+9,99
    А с distinct она будет 5+9,99
  • PEAKTOP © (06.05.10 18:09) [12]
    > sum(distinct должно помочь
    Не факт. если у ТС нету индекса по этому полю, то будет очень интересно... =)

    > Подскажите, как сделать вложенный запрос вида select sum(ячейка)
    > from (select ... from таблица). Или может можно пойти другим путем?


    На Firebird 1.5 - никак. SELECT FROM (SELECT ... FROM) только в Firebird 2.0 появилось, и то с ограничениями. А полностью наслодиццо можно только в Firebird 2.1.
  • sniknik © (06.05.10 19:18) [13]
    > В Ваших запросах я буду иметь опять  много записей, но никак не сумму.
    ну, так, как написал условие, так я и понял

    с учетом доп.инфо и инфы о невозможности вложенных, можно попробовать так
    SELECT Sum(paycash) FROM таблица WHERE ID IN (SELECT Max(ID)  FROM таблица GROUP BY num, paycash)



    WHERE IN  (SELECT ... ) это вроде даже стандарт... хотя с group by в них у FB не уверен.
  • Цукор5 (07.05.10 15:10) [14]
    Все равно долго. В общем, плюнул я на это. Создал представление


    CREATE VIEW GROUPLENTA(
     num,
     paycash // и прочие поля
    FROM
    SELECT num, paycash  from таблица   group by num, paycash;



    И теперь вызываю просто и быстро
    select sum(paycash) from grouplenta where мое условие



    Всем спасибо.
  • sniknik © (07.05.10 15:59) [15]
    > Все равно долго.
    вообще, мой запрос [13] должен быть быстрым, быстрее [14] вьюшка + запрос... если конечно "мое условие" (про которое конечно ни слова ранее) ставить у внутреннего запроса, а не внешнего...
  • turbouser © (07.05.10 16:03) [16]

    > sniknik ©   (07.05.10 15:59) [15]


    > вообще, мой запрос [13] должен быть быстрым

    В FB с IN известные грабли. Тормозит. В двойке, по моему, поправили.
  • TotalSQL (07.05.10 16:14) [17]

    > Цукор5   (06.05.10 17:00) 


    Какова сумма при
    *   12   5,00
    *   12   5,00
    *   13   5,00
    *   13   9,00
    *   14   9,99
    *   14   19,99
    *   14   29,99
    ?
  • sniknik © (07.05.10 16:41) [18]
    > В FB с IN известные грабли.
    ну, если только так.
    но первым, что мне в голову пришло это, что он "навесил" условие на внешний запрос, и тогда сначала выбор/группировка по всей многомиллионной таблице, и только после отбор по условию и проверка на вхождение в раздутый (весь) список ID. гарантировано медленно, если нет приличного оптимизатора конечно, который исправит огрехи логики.
    а вот со вьюшкой быстро, т.к. там стандартно внешнее условие переносится "внутрь", и получается примерно тоже самое по логике, за счет "конструкции" немного "тяжелее".
  • turbouser © (07.05.10 21:34) [19]
    Вообще, странное что-то у ТС. Присоединюсь к

    > TotalSQL   (07.05.10 16:14) [17]
 
Конференция "Базы" » вложенный запрос [D7, FireBird 1.5]
Есть новые Нет новых   [134433   +22][b:0][p:0.001]