Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

вложенный запрос [D7, FireBird 1.5]


Страницы:   1 2

Цукор5 ©   (2010-05-06 17:00:00) 

Имею такую таблицу:
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. Про хранимые процедуры и представления знаю и могу сделать с помощью них, но нельзя.
База стоит и работает и меня не пустят ее править.Задачу желательно решить с помощью запроса.


turbouser   (2010-05-08 15:01:00) [1]


> Anatoly Podgoretsky ©   (08.05.10 13:59) [26]

Это тема для отдельного разговора, выходящего за рамки данной конференции :)


Anatoly Podgoretsky   (2010-05-08 13:59:00) [2]

> turbouser  (08.05.2010 13:06:25)  [25]

Не хорошо пускать это на самотек.


turbouser   (2010-05-08 13:06:00) [3]


> Anatoly Podgoretsky ©   (08.05.10 13:04) [24]

Ну, оставим это решение юзверям :)


Anatoly Podgoretsky   (2010-05-08 13:04:00) [4]

> turbouser  (08.05.2010 12:57:23)  [23]

А может лучше повесить?


turbouser   (2010-05-08 12:57:00) [5]


> Цукор5   (08.05.10 12:46) [22]

Мучайся дальше :) Проектировщик :)


Цукор5   (2010-05-08 12:46:00) [6]

>Привет проектировщикам :) Вешать таких на реях - самый гуманный способ

А я и есть проектировщик. Сам такую структуру создал - сам и мучаюсь. Что не так?


turbouser   (2010-05-07 23:48:00) [7]


> Цукор5   (07.05.10 23:07) [20]


> 12,13,14 - это номера чеков

Привет проектировщикам :) Вешать таких на реях - самый гуманный способ


Цукор5   (2010-05-07 23:07:00) [8]

2 TotalSQL   (07.05.10 16:14) [17]

Какова сумма при
*   12   5,00
*   12   5,00
*   13   5,00
*   13   9,00      // тут ошибка. должно быть 5.00
*   14   9,99
*   14   19,99   // тут ошибка. должно быть 9,99
*   14   29,99   // тут ошибка. должно быть 9,99
?

Такое условие невозможно.
12,13,14 - это номера чеков
а Numeric(18,2) суммы чеков

а с тем, что логика базы хромает согласен. Так уж сложилось.


З.Ы.Господа, вопрос решен см.[14]. Всем спасибо.


turbouser   (2010-05-07 21:34:00) [9]

Вообще, странное что-то у ТС. Присоединюсь к

> TotalSQL   (07.05.10 16:14) [17]


sniknik   (2010-05-07 16:41:00) [10]

> В FB с IN известные грабли.
ну, если только так.
но первым, что мне в голову пришло это, что он "навесил" условие на внешний запрос, и тогда сначала выбор/группировка по всей многомиллионной таблице, и только после отбор по условию и проверка на вхождение в раздутый (весь) список ID. гарантировано медленно, если нет приличного оптимизатора конечно, который исправит огрехи логики.
а вот со вьюшкой быстро, т.к. там стандартно внешнее условие переносится "внутрь", и получается примерно тоже самое по логике, за счет "конструкции" немного "тяжелее".


TotalSQL   (2010-05-07 16:14:00) [11]


> Цукор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
?


turbouser   (2010-05-07 16:03:00) [12]


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


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

В FB с IN известные грабли. Тормозит. В двойке, по моему, поправили.


sniknik   (2010-05-07 15:59:00) [13]

> Все равно долго.
вообще, мой запрос [13] должен быть быстрым, быстрее [14] вьюшка + запрос... если конечно "мое условие" (про которое конечно ни слова ранее) ставить у внутреннего запроса, а не внешнего...


Цукор5   (2010-05-07 15:10:00) [14]

Все равно долго. В общем, плюнул я на это. Создал представление


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


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

Всем спасибо.


sniknik   (2010-05-06 19:18:00) [15]

> В Ваших запросах я буду иметь опять  много записей, но никак не сумму.
ну, так, как написал условие, так я и понял

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

WHERE IN  (SELECT ... ) это вроде даже стандарт... хотя с group by в них у FB не уверен.


PEAKTOP   (2010-05-06 18:09:00) [16]

> sum(distinct должно помочь
Не факт. если у ТС нету индекса по этому полю, то будет очень интересно... =)

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


На Firebird 1.5 - никак. SELECT FROM (SELECT ... FROM) только в Firebird 2.0 появилось, и то с ограничениями. А полностью наслодиццо можно только в Firebird 2.1.


Цукор5   (2010-05-06 18:04:00) [17]

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


turbouser   (2010-05-06 18:00:00) [18]

ясно :) не так понял ТС :)
sum(distinctдолжно помочь


Цукор5   (2010-05-06 18:00:00) [19]

2 Sergey13 ©   (06.05.10 17:56) [8]

Спасибо. Работает, но ОЧЕНЬ долго считает.
Видать прийдется создать ХП и там считать.


Sergey13   (2010-05-06 17:56:00) [20]

> [7] Цукор5   (06.05.10 17:50)

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо