![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
вложенный запрос [D7, FireBird 1.5]
Цукор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)