Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.03.25;
Скачать: CL | DM;

Вниз

вложенный запрос   Найти похожие ветки 

 
Цукор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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.007 c
15-1322648968
Мушрумхэдовец
2011-11-30 14:29
2012.03.25
Как обновить программно страницу браузера?


15-1322328053
картман
2011-11-26 21:20
2012.03.25
что бы почитать?


15-1322396208
Vyacheslav
2011-11-27 16:16
2012.03.25
Delphi XE2 в "режим" Delphi 7


15-1322655766
Тут был я
2011-11-30 16:22
2012.03.25
Ввод тел. номера в Вебмани.


11-1242542465
hroot
2009-05-17 10:41
2012.03.25
Anchors & wsMaximized