Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2023, 10:57   #1
newfam
Новичок
Джуниор
 
Регистрация: 06.06.2023
Сообщений: 3
По умолчанию Запрос на группировку с условием

Есть таблица.
Points - максимальный бал.
Answer - коэф-нт от нуля до 1 с шагом 0.1
Flag - флаг важности показателя.

id zoneid points answer flag
1 1 10 0.8 false
2 1 10 0.1 false
3 1 10 0.5 false

Нужно сгруппировать данные по zoneid и вычислить средний процент по формуле sum(points*answer)/sum(points)
Для указанной таблице результат будет (10*0.8+10*0.1+10*0.5)/(10+10+10) = 14/30 * 100 = 46.6%
С этим запросом проблем нет.

id zoneid points answer flag
1 1 10 0.8 false
2 1 10 0.1 false
3 1 10 0 true

Но если в поле flag будет true, то результат группировки должен быть равен нулю. Это можно рассматривать как флаг важности и он (answer=0 и flag =true) обнуляет все проценты.

Как может выглядеть такой запрос?
newfam вне форума Ответить с цитированием
Старый 06.06.2023, 12:17   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
если в поле flag будет true
хотя бы в одной из строк подлежащих группировке?
Код:
case when flag=true then null else points as fpoints
и вычисления делать по данному полю
Код:
case max(anser flag) =true then 0 else <вычисляем> end
а можно так (с вложенным запросом)
1.
Код:
select zoneid, max(flag) as maxf, min(flag) as minf, <вычисления>
from ...
group by zoneid
Цитата:
С этим запросом проблем нет
2.
Код:
select zoneid, maxf, minf, calc,
when maxf =false then calc else 0 end as calcf 
from ( -- смотри п. 1
       select zoneid, max(flag) as maxf, min(flag) as minf, <вычисления> as calc
       from ...
       group by zoneid
      ) as calc
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 06.06.2023, 13:22   #3
newfam
Новичок
Джуниор
 
Регистрация: 06.06.2023
Сообщений: 3
По умолчанию

Благодарю. Попробую ваш вариант.

Мой вариант:
Код:
SELECT zoneId,
       round( (sum(answer * points) / 10.0) / (sum(points) ) * 100 * ex.cs, 2) AS percent
  FROM mark,
       (
           SELECT CASE t WHEN 1 THEN 0 ELSE 1 END AS cs
             FROM (
                      SELECT EXISTS (
                                 SELECT 1
                                   FROM mark
                                  WHERE answer < 10 AND 
                                        flag = 1
                             )
                             AS t
                  )
       )
       AS ex
 GROUP BY zoneId;

Последний раз редактировалось newfam; 06.06.2023 в 13:41.
newfam вне форума Ответить с цитированием
Старый 07.06.2023, 00:25   #4
newfam
Новичок
Джуниор
 
Регистрация: 06.06.2023
Сообщений: 3
По умолчанию

Воспользовался вашим советом - помогло.
Мой вариант работал только на одной группе zoneID. Стоило добавить еще один набор данных - расчет повёл себя некорректно.
Узнал для себя удобное применение max и min для формирования состояния выборки.
Спасибо еще раз!

Решение:
Код:
SELECT zoneid,
       maxf,
       minf,
       mainflag,
       calc,
       CASE WHEN mainflag = 0 THEN calc ELSE 0 END AS percent
  FROM (
           SELECT zoneid,
                  max(flag) AS maxf,
                  min(flag) AS minf,
                  answer AS answerf,
                  round(sum(points * (answer / 10.0) ) / sum(points) * 100, 2) AS calc,
                  max(iif( (answer = 10 AND 
                            flag = 1) OR 
                           (flag = 0), 0, 1) ) AS mainflag
             FROM mark
            GROUP BY zoneid
       )
       AS calc

Последний раз редактировалось newfam; 07.06.2023 в 12:38. Причина: Изменен SQL запрос в ответе
newfam вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос с условием AndreyIRK SQL, базы данных 4 13.04.2019 14:38
Запрос на группировку и сортировку gigar БД в Delphi 9 22.03.2013 11:43
Запрос с условием Not In d_adilet Microsoft Office Access 1 29.03.2012 08:50
Запрос с условием ArtInt SQL, базы данных 2 05.05.2010 15:58
SQL запрос с условием Veiron SQL, базы данных 4 30.03.2010 19:58