powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Работа функции Sum
8 сообщений из 8, страница 1 из 1
Работа функции Sum
    #34421730
Nitros
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, я пока еще новичок и у меня такая вот проблема:

Задача: Нужно посчитать общую продолжительность звонков за 1 день, например, 26 сентября 2006г.

Запрос №1
select sum(TALK_DURATION) as TOTAL, TALK_DATE, TALK_DURATION
from
PREDBILL
where
TALK_DATE ='2006-09-01'
order by
TALK_DATE
compute sum(TALK_DURATION)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
TOTAL    TALK_DATE               TALK_DURATION
 2885 Oct  7 2004 12:00AM                4 
 2885 Oct  7 2004 12:00AM               13 
 2885 Oct 11 2004 12:00AM               1 
 2885 Oct 11 2004 12:00AM               1 
 2885 Oct 11 2004 12:00AM               1 
 ............................................ 
                                 sum           
                                 ============= 
                                 1700534 
Условие where как будто не учитывается и выводятся все записи таблицы PREDBILL.
Однако, функция sum(TALK_DURATION) действительно вычисляет общую продолжительность разговоров только за 26 сентября. Это видно в запросе №2:

select
TALK_DATE,TALK_DURATION
from
PREDBILL
where
TALK_DATE ='2006-09-01'
order by
TALK_DATE
compute sum(TALK_DURATION)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
TALK_DATE                 TALK_DURATION
Sep  1 2006 12:00AM                4 
Sep  1 2006 12:00AM               13 
Sep  1 2006 12:00AM               1 
Sep  1 2006 12:00AM               1 
Sep  1 2006 12:00AM               1 
 ............................................
                                sum           
                                ============= 
                                        2885 
Как видим, compute sum(TALK_DURATION) возвращает ту же продолжительность разговоров, что и в запросе 1, однако выводятся записи только за 26 сентября, то есть запрос отрабатывает как нужно.

Вопрос: Почему в 1м запросе выводятся все записи таблицы, неужели так работает функция sum()? Или запрос составлен неверно?

P.S. Sybase ASE 12.5.1
...
Рейтинг: 0 / 0
Работа функции Sum
    #34422115
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще в первом запросе надо добавить GROUP BY TALK_DATE, TALK_DURATION
...
Рейтинг: 0 / 0
Работа функции Sum
    #34422145
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если исходить из задачи:
авторЗадача: Нужно посчитать общую продолжительность звонков за 1 день, например, 26 сентября 2006г.

то достаточно написать
Код: plaintext
1.
2.
select sum(TALK_DURATION) as TOTAL 
from PREDBILL
where TALK_DATE ='2006-09-01' 
...
Рейтинг: 0 / 0
Работа функции Sum
    #34422282
SDAyug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 MasterZiv:

select sum(TALK_DURATION) as TOTAL, TALK_DATE, TALK_DURATION
from
PREDBILL
where
TALK_DATE ='2006-09-01'
group by
TALK_DATE,TALK_DURATION
order by TALK_DATE
compute sum(TALK_DURATION)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
   TOTAL    TALK_DATE               TALK_DURATION
  460 Sep  1 2006 12:00AM                      1 
  460 Sep  1 2006 12:00AM                      1
  460 Sep  1 2006 12:00AM                      1
  446 Sep  1 2006 12:00AM                      2
  446 Sep  1 2006 12:00AM                      2
  446 Sep  1 2006 12:00AM                      2
  318 Sep  1 2006 12:00AM                      3
  318 Sep  1 2006 12:00AM                      3

 ............................................ 
                                 sum           
                                 ============= 
                                 3241 
???sum
=============
3241
Результат понятен: строки группируются по дате и продолжительности звонков. Но!
Изменилась общая продолжительность звонков...Не пойму почему

2 Dmitry.

TOTAL
-----------
2885
Выполняется. Но если добавить в поле select любое поле, например,
select sum(TALK_DURATION), TALK_DATE
from
PREDBILL
where
TALK_DATE='2006-09-01'

То запрос возвращает все записи таблицы
...
Рейтинг: 0 / 0
Работа функции Sum
    #34422403
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SDAyugВыполняется. Но если добавить в поле select любое поле, например,
select sum(TALK_DURATION), TALK_DATE
from
PREDBILL
where
TALK_DATE='2006-09-01'
То запрос возвращает все записи таблицы


все правильно.
...
Рейтинг: 0 / 0
Работа функции Sum
    #34422473
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело в том, что ASE позволяет иметь в агрегирующем запросе (который содержит хотя бы одну агрегирующую функцию) поля, которые не входят ни в список агрегируемых полей, ни в GROUP BY. Это НЕДОПУСТИМО согласно стандарта SQL, но ASE это разрешает, причем без всяческих предупреждений и в режиме по-умолчанию. Поведение, которое предлагается в этом случае, удивительно глупое и никому не нужное (я не буду его описывать именно поэтому). Но с этим приходится жить и с ним бороться, поэтому нужно всегда проверять запросы на соблюдение стандарта.

Во всемирных (англоязычных) форумах не раз поднимали вопрос о удалении этого рудимента (потому что никто толком даже не знает, зачем это нужно), но разработчики ASE не жаждут это делать по вполне понятным причинам - все это описано, возможно кто-то это использует, и надо переделывать код.


Конкретно в этом случае надо либо выбросить доп. колонки из списка вывода запроса, либо написать еще GROUP BY по этим колонкам.
...
Рейтинг: 0 / 0
Работа функции Sum
    #34423864
SDAyug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivДело в том, что ASE позволяет иметь в агрегирующем запросе (который содержит хотя бы одну агрегирующую функцию) поля, которые не входят ни в список агрегируемых полей, ни в GROUP BY. Это НЕДОПУСТИМО согласно стандарта SQL, но ASE это разрешает, причем без всяческих предупреждений и в режиме по-умолчанию. Поведение, которое предлагается в этом случае, удивительно глупое и никому не нужное (я не буду его описывать именно поэтому). Но с этим приходится жить и с ним бороться, поэтому нужно всегда проверять запросы на соблюдение стандарта.

Во всемирных (англоязычных) форумах не раз поднимали вопрос о удалении этого рудимента (потому что никто толком даже не знает, зачем это нужно), но разработчики ASE не жаждут это делать по вполне понятным причинам - все это описано, возможно кто-то это использует, и надо переделывать код.


Конкретно в этом случае надо либо выбросить доп. колонки из списка вывода запроса, либо написать еще GROUP BY по этим колонкам.

Да знать бы об этом раньше и не потерял бы столько времени на отлов непонятных глюков.
Спасибо за исчерпывающий ответ.
...
Рейтинг: 0 / 0
Работа функции Sum
    #34424919
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А документацию читать надо. Там все написано, весь этот дебилизм подробно объяснен.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Работа функции Sum
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]