Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Работа функции Sum
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, я пока еще новичок и у меня такая вот проблема: Задача: Нужно посчитать общую продолжительность звонков за 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. Однако, функция 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. Вопрос: Почему в 1м запросе выводятся все записи таблицы, неужели так работает функция sum()? Или запрос составлен неверно? P.S. Sybase ASE 12.5.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 14:25 |
|
||
|
Работа функции Sum
|
|||
|---|---|---|---|
|
#18+
Вообще в первом запросе надо добавить GROUP BY TALK_DATE, TALK_DURATION ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 15:35 |
|
||
|
Работа функции Sum
|
|||
|---|---|---|---|
|
#18+
если исходить из задачи: авторЗадача: Нужно посчитать общую продолжительность звонков за 1 день, например, 26 сентября 2006г. то достаточно написать Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 15:41 |
|
||
|
Работа функции Sum
|
|||
|---|---|---|---|
|
#18+
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. ============= 3241 Результат понятен: строки группируются по дате и продолжительности звонков. Но! Изменилась общая продолжительность звонков...Не пойму почему 2 Dmitry. TOTAL ----------- 2885 Выполняется. Но если добавить в поле select любое поле, например, select sum(TALK_DURATION), TALK_DATE from PREDBILL where TALK_DATE='2006-09-01' То запрос возвращает все записи таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 16:16 |
|
||
|
Работа функции Sum
|
|||
|---|---|---|---|
|
#18+
SDAyugВыполняется. Но если добавить в поле select любое поле, например, select sum(TALK_DURATION), TALK_DATE from PREDBILL where TALK_DATE='2006-09-01' То запрос возвращает все записи таблицы все правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 16:38 |
|
||
|
Работа функции Sum
|
|||
|---|---|---|---|
|
#18+
Дело в том, что ASE позволяет иметь в агрегирующем запросе (который содержит хотя бы одну агрегирующую функцию) поля, которые не входят ни в список агрегируемых полей, ни в GROUP BY. Это НЕДОПУСТИМО согласно стандарта SQL, но ASE это разрешает, причем без всяческих предупреждений и в режиме по-умолчанию. Поведение, которое предлагается в этом случае, удивительно глупое и никому не нужное (я не буду его описывать именно поэтому). Но с этим приходится жить и с ним бороться, поэтому нужно всегда проверять запросы на соблюдение стандарта. Во всемирных (англоязычных) форумах не раз поднимали вопрос о удалении этого рудимента (потому что никто толком даже не знает, зачем это нужно), но разработчики ASE не жаждут это делать по вполне понятным причинам - все это описано, возможно кто-то это использует, и надо переделывать код. Конкретно в этом случае надо либо выбросить доп. колонки из списка вывода запроса, либо написать еще GROUP BY по этим колонкам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2007, 16:55 |
|
||
|
Работа функции Sum
|
|||
|---|---|---|---|
|
#18+
MasterZivДело в том, что ASE позволяет иметь в агрегирующем запросе (который содержит хотя бы одну агрегирующую функцию) поля, которые не входят ни в список агрегируемых полей, ни в GROUP BY. Это НЕДОПУСТИМО согласно стандарта SQL, но ASE это разрешает, причем без всяческих предупреждений и в режиме по-умолчанию. Поведение, которое предлагается в этом случае, удивительно глупое и никому не нужное (я не буду его описывать именно поэтому). Но с этим приходится жить и с ним бороться, поэтому нужно всегда проверять запросы на соблюдение стандарта. Во всемирных (англоязычных) форумах не раз поднимали вопрос о удалении этого рудимента (потому что никто толком даже не знает, зачем это нужно), но разработчики ASE не жаждут это делать по вполне понятным причинам - все это описано, возможно кто-то это использует, и надо переделывать код. Конкретно в этом случае надо либо выбросить доп. колонки из списка вывода запроса, либо написать еще GROUP BY по этим колонкам. Да знать бы об этом раньше и не потерял бы столько времени на отлов непонятных глюков. Спасибо за исчерпывающий ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2007, 11:17 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=34422403&tid=2012180]: |
0ms |
get settings: |
5ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 222ms |
| total: | 350ms |

| 0 / 0 |
