-
Имею такую таблицу: 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. Про хранимые процедуры и представления знаю и могу сделать с помощью них, но нельзя. База стоит и работает и меня не пустят ее править.Задачу желательно решить с помощью запроса.
-
> как сделать вложенный запрос вида select sum(ячейка) from (select ... from таблица). а вот именно так и делается как написал... только в основном (вложенном я бы не делал group by я бы сделал distinct все таки группировка предполагает агрегирующие функции, а у тебя их в нем нет) т.е. SELECT num, sum(ячейка) from
(select distinct ... from таблица)
group by num (орфография сохранена... х.з. может в ней что то важное)
-
SELECT num, max(paycash) from таблица group by num
-
turbouser © (06.05.10 17:33) [2]это же не сумма а кстати где то видел такой синтаксис, не знаю уж пойдет с FB и будет ли делать то что хочется... SELECT num, sum(distinct paycash) from таблица group by num
-
>а вот именно так и делается как написал Хм. Почему тогда получаю это:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 2, char 3.
select. Да и разве можно подобное делать в FireBird 1.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 Такие данные ВОЗМОЖНО говорят о том, что нормализация БД хромает и надо подумать о выводе указанных данных в отдельную таблицу.
-
>sniknik © И еще одно уточнение. Мне нужна сумма. Т.е одно число. В Ваших запросах я буду иметь опять много записей, но никак не сумму.
-
Пардон, можен написал как-то непонятно. Задача отобразить сумму. Т.е. 5+1,12+9,99 = 16,11
-
> [7] Цукор5 (06.05.10 17:50)
SELECT sum(paycash) from таблица t1 where id=(select max(id) from таблица t2 where t2.num=t1.num)
-
2 Sergey13 © (06.05.10 17:56) [8] Спасибо. Работает, но ОЧЕНЬ долго считает. Видать прийдется создать ХП и там считать.
-
ясно :) не так понял ТС :) sum(distinct должно помочь
-
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
-
> sum(distinct должно помочь Не факт. если у ТС нету индекса по этому полю, то будет очень интересно... =)
> Подскажите, как сделать вложенный запрос вида select sum(ячейка) > from (select ... from таблица). Или может можно пойти другим путем?
На Firebird 1.5 - никак. SELECT FROM (SELECT ... FROM) только в Firebird 2.0 появилось, и то с ограничениями. А полностью наслодиццо можно только в Firebird 2.1.
-
> В Ваших запросах я буду иметь опять много записей, но никак не сумму. ну, так, как написал условие, так я и понял с учетом доп.инфо и инфы о невозможности вложенных, можно попробовать так SELECT Sum(paycash) FROM таблица WHERE ID IN (SELECT Max(ID) FROM таблица GROUP BY num, paycash) WHERE IN (SELECT ... ) это вроде даже стандарт... хотя с group by в них у FB не уверен.
-
Все равно долго. В общем, плюнул я на это. Создал представление
CREATE VIEW GROUPLENTA(
num,
paycash FROM
SELECT num, paycash from таблица group by num, paycash;
И теперь вызываю просто и быстро select sum(paycash) from grouplenta where мое условие Всем спасибо.
-
> Все равно долго. вообще, мой запрос [13] должен быть быстрым, быстрее [14] вьюшка + запрос... если конечно "мое условие" (про которое конечно ни слова ранее) ставить у внутреннего запроса, а не внешнего...
-
> sniknik © (07.05.10 15:59) [15]
> вообще, мой запрос [13] должен быть быстрым
В FB с IN известные грабли. Тормозит. В двойке, по моему, поправили.
-
> Цукор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 ?
-
> В FB с IN известные грабли. ну, если только так. но первым, что мне в голову пришло это, что он "навесил" условие на внешний запрос, и тогда сначала выбор/группировка по всей многомиллионной таблице, и только после отбор по условию и проверка на вхождение в раздутый (весь) список ID. гарантировано медленно, если нет приличного оптимизатора конечно, который исправит огрехи логики. а вот со вьюшкой быстро, т.к. там стандартно внешнее условие переносится "внутрь", и получается примерно тоже самое по логике, за счет "конструкции" немного "тяжелее".
-
Вообще, странное что-то у ТС. Присоединюсь к
> TotalSQL (07.05.10 16:14) [17]
|