Форум: "Базы";
Текущий архив: 2012.03.25;
Скачать: [xml.tar.bz2];
Внизвложенный запрос Найти похожие ветки
← →
Цукор5 (2010-05-06 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 © (2010-05-06 17:33) [1]> как сделать вложенный запрос вида select sum(ячейка) from (select ... from таблица).
а вот именно так и делается как написал... только в основном (вложенном я бы не делал group by я бы сделал distinct все таки группировка предполагает агрегирующие функции, а у тебя их в нем нет)
т.е.SELECT num, sum(ячейка) from
(select distinct ... from таблица)
group by num
(орфография сохранена... х.з. может в ней что то важное)
← →
turbouser © (2010-05-06 17:33) [2]SELECT num, max(paycash) from таблица group by num
← →
sniknik © (2010-05-06 17:43) [3]turbouser © (06.05.10 17:33) [2]
это же не сумма
а кстати где то видел такой синтаксис, не знаю уж пойдет с FB и будет ли делать то что хочется...SELECT num, sum(distinct paycash) from таблица group by num
← →
Цукор5 (2010-05-06 17:45) [4]>а вот именно так и делается как написал
Хм. Почему тогда получаю это:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 2, char 3.
select.
Да и разве можно подобное делать в FireBird 1.5?
← →
Sergey13 © (2010-05-06 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 (2010-05-06 17:47) [6]>sniknik ©
И еще одно уточнение. Мне нужна сумма. Т.е одно число. В Ваших запросах я буду иметь опять много записей, но никак не сумму.
← →
Цукор5 (2010-05-06 17:50) [7]Пардон, можен написал как-то непонятно.
Задача отобразить сумму. Т.е. 5+1,12+9,99 = 16,11
← →
Sergey13 © (2010-05-06 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 (2010-05-06 18:00) [9]2 Sergey13 © (06.05.10 17:56) [8]
Спасибо. Работает, но ОЧЕНЬ долго считает.
Видать прийдется создать ХП и там считать.
← →
turbouser © (2010-05-06 18:00) [10]ясно :) не так понял ТС :)
sum(distinct
должно помочь
← →
Цукор5 (2010-05-06 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 © (2010-05-06 18:09) [12]> sum(distinct должно помочь
Не факт. если у ТС нету индекса по этому полю, то будет очень интересно... =)
> Подскажите, как сделать вложенный запрос вида select sum(ячейка)
> from (select ... from таблица). Или может можно пойти другим путем?
На Firebird 1.5 - никак. SELECT FROM (SELECT ... FROM) только в Firebird 2.0 появилось, и то с ограничениями. А полностью наслодиццо можно только в Firebird 2.1.
← →
sniknik © (2010-05-06 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 (2010-05-07 15:10) [14]Все равно долго. В общем, плюнул я на это. Создал представление
CREATE VIEW GROUPLENTA(
num,
paycash // и прочие поля
FROM
SELECT num, paycash from таблица group by num, paycash;
И теперь вызываю просто и быстроselect sum(paycash) from grouplenta where мое условие
Всем спасибо.
← →
sniknik © (2010-05-07 15:59) [15]> Все равно долго.
вообще, мой запрос [13] должен быть быстрым, быстрее [14] вьюшка + запрос... если конечно "мое условие" (про которое конечно ни слова ранее) ставить у внутреннего запроса, а не внешнего...
← →
turbouser © (2010-05-07 16:03) [16]
> sniknik © (07.05.10 15:59) [15]
> вообще, мой запрос [13] должен быть быстрым
В FB с IN известные грабли. Тормозит. В двойке, по моему, поправили.
← →
TotalSQL (2010-05-07 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 © (2010-05-07 16:41) [18]> В FB с IN известные грабли.
ну, если только так.
но первым, что мне в голову пришло это, что он "навесил" условие на внешний запрос, и тогда сначала выбор/группировка по всей многомиллионной таблице, и только после отбор по условию и проверка на вхождение в раздутый (весь) список ID. гарантировано медленно, если нет приличного оптимизатора конечно, который исправит огрехи логики.
а вот со вьюшкой быстро, т.к. там стандартно внешнее условие переносится "внутрь", и получается примерно тоже самое по логике, за счет "конструкции" немного "тяжелее".
← →
turbouser © (2010-05-07 21:34) [19]Вообще, странное что-то у ТС. Присоединюсь к
> TotalSQL (07.05.10 16:14) [17]
← →
Цукор5 (2010-05-07 23:07) [20]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 23:48) [21]
> Цукор5 (07.05.10 23:07) [20]
> 12,13,14 - это номера чеков
Привет проектировщикам :) Вешать таких на реях - самый гуманный способ
← →
Цукор5 (2010-05-08 12:46) [22]>Привет проектировщикам :) Вешать таких на реях - самый гуманный способ
А я и есть проектировщик. Сам такую структуру создал - сам и мучаюсь. Что не так?
← →
turbouser © (2010-05-08 12:57) [23]
> Цукор5 (08.05.10 12:46) [22]
Мучайся дальше :) Проектировщик :)
← →
Anatoly Podgoretsky © (2010-05-08 13:04) [24]> turbouser (08.05.2010 12:57:23) [23]
А может лучше повесить?
← →
turbouser © (2010-05-08 13:06) [25]
> Anatoly Podgoretsky © (08.05.10 13:04) [24]
Ну, оставим это решение юзверям :)
← →
Anatoly Podgoretsky © (2010-05-08 13:59) [26]> turbouser (08.05.2010 13:06:25) [25]
Не хорошо пускать это на самотек.
← →
turbouser © (2010-05-08 15:01) [27]
> Anatoly Podgoretsky © (08.05.10 13:59) [26]
Это тема для отдельного разговора, выходящего за рамки данной конференции :)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2012.03.25;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.003 c