Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.005 c
11-1242542465
hroot
2009-05-17 10:41
2012.03.25
Anchors & wsMaximized


3-1252904459
ruslan_as
2009-09-14 09:00
2012.03.25
dbf файл - не видно чисел


2-1323433650
_qwerty_
2011-12-09 16:27
2012.03.25
DataSet.Edit - Dataset.Post - DataSet.Cancel


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


15-1322644551
И. Павел
2011-11-30 13:15
2012.03.25
Как праильно задать права на таблицу (MS SQL SERVER 2005)?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский