powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Почему не правильно считает?
5 сообщений из 5, страница 1 из 1
Почему не правильно считает?
    #39796175
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть 4 запроса, почему не правильно считает суммарное значение?

Код: sql
1.
2.
3.
4.
5.
6.
Вот здесь ошибка в подсчете:
UPDATE motion set result= (SELECT sum(case when ((datecreate between '2019-01-01' AND '2019-04-04')AND((resultview <> 'ПЕРЕАДРЕСАЦИЯ')AND(resultview <> 'ОТЗЫВ ОБРАЩЕНИЯ'))) AND ((dateisp BETWEEN datecreate AND d15)OR(dateisp BETWEEN d15 AND d30)OR(dateisp > d30))   then 1 else 0 end)AS p3  FROM register WHERE docid<>0 ) WHERE KODnom='3'

UPDATE motion set result= (SELECT sum(case when ((datecreate between '2019-01-01' AND '2019-04-04')AND((resultview <> 'ПЕРЕАДРЕСАЦИЯ')AND(resultview <> 'ОТЗЫВ ОБРАЩЕНИЯ'))) AND (dateisp BETWEEN datecreate AND d15)   then 1 else 0 end)AS p3_1  FROM register WHERE docid<>0 ) WHERE KODnom='3.1'
UPDATE motion set result= (SELECT sum(case when ((datecreate between '2019-01-01' AND '2019-04-04')AND((resultview <> 'ПЕРЕАДРЕСАЦИЯ')AND(resultview <> 'ОТЗЫВ ОБРАЩЕНИЯ'))) AND (dateisp BETWEEN d15 AND d30)   then 1 else 0 end)AS p3_2 FROM register WHERE docid<>0 ) WHERE KODnom='3.2'
UPDATE motion set result= (SELECT sum(case when ((datecreate between '2019-01-01' AND '2019-04-04')AND((resultview <> 'ПЕРЕАДРЕСАЦИЯ')AND(resultview <> 'ОТЗЫВ ОБРАЩЕНИЯ'))) AND (dateisp > d30)   then 1 else 0 end)AS p3_3  FROM register WHERE docid<>0 ) WHERE KODnom='3.3'



Результат:
908194
...
Рейтинг: 0 / 0
Почему не правильно считает?
    #39796205
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Без структуры хранения и тестовых данных вопрос не имеет смысла
2) Отформатировать вопрос - не судьба? есть же кнопка "Просмотр"...
...
Рейтинг: 0 / 0
Почему не правильно считает?
    #39796224
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina1) Без структуры хранения и тестовых данных вопрос не имеет смысла
2) Отформатировать вопрос - не судьба? есть же кнопка "Просмотр"...
Почему не имеет, есть 3 условия, по отдельности они выводят правильные значения, но если их объединить, то почему-то выводится неверное значение. Вот и вопрос...
Просматривал перед отправкой, думал будет автоперенос строк...
...
Рейтинг: 0 / 0
Почему не правильно считает?
    #39796386
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну давайте я просто отформатирую первый запрос...

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
UPDATE motion 
SET result= (SELECT SUM(CASE WHEN     (    (datecreate BETWEEN '2019-01-01' AND '2019-04-04')
                                        AND(    (resultview <> 'ПЕРЕАДРЕСАЦИЯ')
                                             AND(resultview <> 'ОТЗЫВ ОБРАЩЕНИЯ')
                                           )
                                      ) 
                                  AND (    (dateisp BETWEEN datecreate AND d15)
                                        OR (dateisp BETWEEN d15 AND d30)
                                        OR (dateisp > d30)
                                      )   
                             THEN 1 
                             ELSE 0 END ) AS p3  
             FROM register 
             WHERE docid<>0 ) 
WHERE KODnom='3'


Смотрим вот на этот "весёлый" фрагмент:

Код: sql
1.
2.
3.
4.
(    (dateisp BETWEEN datecreate AND d15)
  OR (dateisp BETWEEN d15 AND d30)
  OR (dateisp > d30)
)   


Нравится? Мне - не очень. Ибо он предполагает datecreate >= d15 >= d30 (кстати, выполняется?) и заменяется простейшим

Код: sql
1.
dateisp >= datecreate


Дальше. Вот это:

Код: sql
1.
2.
    (resultview <> 'ПЕРЕАДРЕСАЦИЯ')
AND (resultview <> 'ОТЗЫВ ОБРАЩЕНИЯ')


можно заменить более понятным

Код: sql
1.
resultview NOT IN ('ПЕРЕАДРЕСАЦИЯ', 'ОТЗЫВ ОБРАЩЕНИЯ')


Далее. У Вас присутствует вот такая конструкция:

Код: sql
1.
SUM(CASE WHEN (condition) THEN 1 ELSE 0 END)


Она полностью эквивалентна конструкции

Код: sql
1.
SUM(condition)


Ну и алиас в выражении присвоения - не нужен.

С учётом всего вышенаписанного, а также после удаления лишних (с учётом приоритетов операций) скобок, запрос упрощается до

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
UPDATE motion 
SET result = ( SELECT SUM(     datecreate BETWEEN '2019-01-01' AND '2019-04-04'
                           AND resultview NOT IN ('ПЕРЕАДРЕСАЦИЯ', 'ОТЗЫВ ОБРАЩЕНИЯ')
                           AND dateisp >= datecreate
                         )
               FROM register 
               WHERE docid<>0
             )
WHERE KODnom='3'



Пожалуйста, пересмотрите, оптимизируйте, и отформатируйте все Ваши запросы до обозримого состояния. Приведите структуры используемых таблиц (поля, не используемые в запросах, кроме входящих в первичные и уникальные индексы, а также атрибуты таблицы - можно удалить) и покажите пример данных для каждой таблицы. Ещё лучше - привести десяток-другой записей, для которых и показать получаемые неправильные результаты. Вместо абстрактных четырёх чисел... Совсем хорошо - представить всё это в виде fiddle.
...
Рейтинг: 0 / 0
Почему не правильно считает?
    #39803640
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaНу давайте я просто отформатирую первый запрос...

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
UPDATE motion 
SET result= (SELECT SUM(CASE WHEN     (    (datecreate BETWEEN '2019-01-01' AND '2019-04-04')
                                        AND(    (resultview <> 'ПЕРЕАДРЕСАЦИЯ')
                                             AND(resultview <> 'ОТЗЫВ ОБРАЩЕНИЯ')
                                           )
                                      ) 
                                  AND (    (dateisp BETWEEN datecreate AND d15)
                                        OR (dateisp BETWEEN d15 AND d30)
                                        OR (dateisp > d30)
                                      )   
                             THEN 1 
                             ELSE 0 END ) AS p3  
             FROM register 
             WHERE docid<>0 ) 
WHERE KODnom='3'


Смотрим вот на этот "весёлый" фрагмент:

Код: sql
1.
2.
3.
4.
(    (dateisp BETWEEN datecreate AND d15)
  OR (dateisp BETWEEN d15 AND d30)
  OR (dateisp > d30)
)   


Нравится? Мне - не очень. Ибо он предполагает datecreate >= d15 >= d30 (кстати, выполняется?) и заменяется простейшим

Код: sql
1.
dateisp >= datecreate


Дальше. Вот это:

Код: sql
1.
2.
    (resultview <> 'ПЕРЕАДРЕСАЦИЯ')
AND (resultview <> 'ОТЗЫВ ОБРАЩЕНИЯ')


можно заменить более понятным

Код: sql
1.
resultview NOT IN ('ПЕРЕАДРЕСАЦИЯ', 'ОТЗЫВ ОБРАЩЕНИЯ')


Далее. У Вас присутствует вот такая конструкция:

Код: sql
1.
SUM(CASE WHEN (condition) THEN 1 ELSE 0 END)


Она полностью эквивалентна конструкции

Код: sql
1.
SUM(condition)


Ну и алиас в выражении присвоения - не нужен.

С учётом всего вышенаписанного, а также после удаления лишних (с учётом приоритетов операций) скобок, запрос упрощается до

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
UPDATE motion 
SET result = ( SELECT SUM(     datecreate BETWEEN '2019-01-01' AND '2019-04-04'
                           AND resultview NOT IN ('ПЕРЕАДРЕСАЦИЯ', 'ОТЗЫВ ОБРАЩЕНИЯ')
                           AND dateisp >= datecreate
                         )
               FROM register 
               WHERE docid<>0
             )
WHERE KODnom='3'



Пожалуйста, пересмотрите, оптимизируйте, и отформатируйте все Ваши запросы до обозримого состояния. Приведите структуры используемых таблиц (поля, не используемые в запросах, кроме входящих в первичные и уникальные индексы, а также атрибуты таблицы - можно удалить) и покажите пример данных для каждой таблицы. Ещё лучше - привести десяток-другой записей, для которых и показать получаемые неправильные результаты. Вместо абстрактных четырёх чисел... Совсем хорошо - представить всё это в виде fiddle.
а как быть с:
Код: sql
1.
2.
3.
4.
(    (dateisp BETWEEN datecreate AND d15)
  OR (dateisp BETWEEN d15 AND d30)
  OR (dateisp > d30)
) 



авторdateisp=datecreate+14 суток
datecreate=01.04.2019
dateisp=15.04.2019
d15=16.04.2019
d30=02.05.2019 (с учетом производственного календаря)
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Почему не правильно считает?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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