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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2018, 12:51   #1
Etsareva
Форумчанин
 
Регистрация: 26.01.2018
Сообщений: 180
По умолчанию запрос с group by

Добрый день! есть такой запрос:
Код:
select '', '', pkr.ods, pkr.oup, unr.obm, unei.oei, 0, ;
round (iif (unr.pan=" ", unr.unr1*pkr.plo*unei.k, ;
(iif (unr.pan="A" or unr.pan="А", unr.unr1*pkr.plo*pkr.tol*unei.k, ;
(iif (unr.pan="P" or unr.pan="Р", unr.unr1*pkr.plo*pkr.tol*unei.k*1.667*1.006, unr.unr1*pkr.plo*pkr.tol*unei.k*1.006))))),9) as nor, ;
0, pkr.cex, pkr.tpr, unr.pan, pkr.prs, unr.pm, unr.di, unr.pri, unr.izw ;
from pkr, unr, unei, n112 ;
where unr.tpr=pkr.tpr and unr.kets=unei.kets and n112.ods=pkr.ods and (pkr.tol!=0 and pkr.anod!=0) ;
GROUP BY pkr.ods HAVING count(*)=1 and (pkr.tol=0 and pkr.anod=0)
задача такова: в условии должны выводиться записи, у которых анод<>0 и тол.<>0 (pkr.tol!=0 and pkr.anod!=0) И записи, ods которых уникально
(не повторяется) и анод=0 и тол=0 (GROUP BY pkr.ods HAVING count(*)=1 and (pkr.tol=0 and pkr.anod=0)). То, что до GROUP BY, отрабатывается, а вот
сам GROUP BY нет. как сделать это корректно? Спасибо!
Etsareva вне форума Ответить с цитированием
Старый 13.12.2018, 14:11   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
а вот сам GROUP BY нет
все поля запроса
  • либо перечислены в GROUP BY
  • либо имеют групповую операцию count, sum, max, min, ...
Код:
select ods, --перечислена в group
sum(...), max(...), count(...) --остальным задана групповая операция
from ....
group by ods

Код:
select ....
from ...
where ... -- анод тол =0
  AND ods in (  -- уникальные ods 
              select ods --ровно одно поле для работы in
              from ....
              group by ods
              having count(*)=1 
            )
Код:
select ....
from ...
inner join ( select ods, count(*) as nn
                 from ....
                 group by ods 
             ) as odsnn on odsnn.ods =prk.ods and odsnn =1
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 13.12.2018, 16:05   #3
Etsareva
Форумчанин
 
Регистрация: 26.01.2018
Сообщений: 180
По умолчанию

спасибо! задам еще вопрос (может и бредовый конечно)!
возможно ли сделать такое:
в таблице есть несколько записей одного tpr,
например:
TPR | pan
ИД25171.00029-01 |
ИД25171.00029-01 |
ИД25171.00029-01 |
ИД25171.00029-01 |
ИД25171.00029-01 | А
___________________________________ _
ИД25171.00054-11 |
ИД25171.00054-11 |
ИД25171.00054-11 |
ИД25171.00054-11 |
....
Можно ли вывести только те tpr, во всех записях которых pan=0 , т.е. вывести только

ИД25171.00054-11 |
ИД25171.00054-11 |
ИД25171.00054-11 |
ИД25171.00054-11 |
?
Etsareva вне форума Ответить с цитированием
Старый 13.12.2018, 16:45   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
во всех записях которых pan=0
Код:
where pan =0  --именно что НОЛЬ
Код:
where pan is NULL --или НЕОПРЕДЕЛЕНО
все это есть Мартин Грубер. Понимание SQL
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 13.12.2018 в 17:01.
evg_m вне форума Ответить с цитированием
Старый 17.12.2018, 09:24   #5
Etsareva
Форумчанин
 
Регистрация: 26.01.2018
Сообщений: 180
По умолчанию

добрый день! вывела таким запросом записи с дублями
[code] SELECT * FROM unr WHERE tpr IN (select tpr from unr group by tpr having count(tpr)>1 ) [\code]
как вывести следующее из этого:
если хотя бы у одной из повторяющейся записи в поле pm есть к.-л. значение, то не выводить эту запись вообще (вместе с дублями)?
например, возьму те же самый записи:
ИД25171.00054-11 |
ИД25171.00054-11 |
ИД25171.00054-11 |
ИД25171.00054-11 | - здесь нет в поле pm ничего, значит, выводим
_____________________
ИД25171.00054-11 | 1
ИД25171.00054-11 |
ИД25171.00054-11 |
ИД25171.00054-11 | - здесь в поле pm стоит 1, значит эту запись не выводим (и дубликаты тоже).
Etsareva вне форума Ответить с цитированием
Старый 17.12.2018, 10:08   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

так теперь у нас разные ods (есть/нет pm)
убираем ods in в "обычный" подзапрос
Код:
select ...
from .... , (  select ods,
   count(*) as cnt --конечно же здесь надо это "посчитать" и "передать наверх"
           from ...
           group by ods
           having count(*)>1 --можно конечно и здесь оставить
          ) as sts 
where ...
   and ods =sts.ods 
   and sts.cnt>1 --но лучше на мой взгляд это будет здесь
добавляем поля "расчета" pm как max(pm) --теперь мы может себе это позволить
если нельзя просто max(pm), то можно вот так max(IIF(pm is NULL,0,1))

Код:
select ...
from .... , (  select ods, max(pm) as spm, count(*) as cnt
           from ...
           group by ods
           having count(*)>1 and max(pm) is NULL --можно конечно и здесь оставить
          ) as sts 
where ...
  and ods =sts.ods 
   and sts.cnt>1 --но лучше на мой взгляд это будет здесь
  and sts.spm is NULL --или что там у нас будет для подходящих max(pm)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 18.12.2018 в 09:32. Причина: -конечно же здесь надо это "посчитать" и "передать наверх"
evg_m вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
group by ts-alan C# (си шарп) 4 24.04.2013 16:33
group by ts-alan C# (си шарп) 2 21.03.2013 21:22
Group by and Having Progsenya SQL, базы данных 1 19.02.2011 19:18
GROUP BY Syltan SQL, базы данных 1 03.11.2009 13:39
Group в Excel Ora Общие вопросы Delphi 0 21.04.2009 11:04