AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.09.2009, 12:54   #1  
s.alex is offline
s.alex
Участник
 
28 / 10 (1) +
Регистрация: 07.06.2007
select Count(RecId) и join
Добрый день.

Задача посчитать количество записей в таблице по какому-то условию, т.е. простой select Count(RecId) from Table1. Это работает до тех пор пока я не пытаюсь усложнить условия выбора и связать Table1 с другой таблицей, например:
select Count(RecId) from Table1
join Table2 where Table1.field1 == Table2.field1 && Table2.field2 == "111"

Сразу возникает ошибка с сообщением:
Сообщение (14:50:13)
Невозможно выбрать запись в "Складские проводки" ("InventTrans") Ссылка: Заказ, .
База данных SQL обнаружила ошибку.
Описание ошибки SQL: ORA-00937: not a single-group group function
Оператор SQL: ...

Судя по сообщению, SQL-ю нужна группировка (group), но мне то она не нужна, мне нужно количество всех записей, а не количество записей в группах!! Как решить эту задачу?
Старый 22.09.2009, 12:57   #2  
NeveB is offline
NeveB
Участник
 
60 / 16 (1) ++
Регистрация: 14.11.2003
Адрес: Mosсow
группируйте по DataAreaId или TableId
Старый 22.09.2009, 13:06   #3  
s.alex is offline
s.alex
Участник
 
28 / 10 (1) +
Регистрация: 07.06.2007
Спасибо, помогло!
На самом деле у меня три join, в каждом вставил group by TableId и запрос стал выполняться.
Старый 22.09.2009, 13:37   #4  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Делайте exists join, иначе найдете неверное количество записей в основной таблице.
__________________
// no comments
Старый 22.09.2009, 14:02   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Синтаксис вида

join Table where ...

предполагает, что из таблицы Table необходимо взять все поля. Что противоречит аггрегирующей функции Count() в первом select. Необходимо либо добавить аггрегирующую функцию и во вторую таблицу

X++:
select Count(RecId) from Table1
join Count(RecId) from Table2 where Table1.field1 == Table2.field1 && Table2.field2 == "111"
Либо указать в качестве списка полей второй таблицы - константу. Обычно это TableId

X++:
select Count(RecId) from Table1
join TableId from Table2 where Table1.field1 == Table2.field1 && Table2.field2 == "111"
Добавление группировки, также ограничивает выводимый список полей только полями, участвующими в группировке. Но это не явное ограничение, которое, по возможности, желательно избегать. Просто запрос становится "не прозрачным"

Ну, или воспользоваться советом dech и использовать exists join. Но это уже зависит от того, какое именно количество нужно подсчитать.
За это сообщение автора поблагодарили: mazzy (2).
Старый 04.09.2012, 15:31   #6  
propeller is offline
propeller
Участник
Аватар для propeller
 
359 / 29 (1) +++
Регистрация: 25.07.2007
X++:
        select count (RecId) from inventTrans
        group by ItemId    
        join inventDim
        group by InventSizeId, InventLocationId, InventColorId
        where inventDim.inventDimId      == inventTrans.inventDimId &&
              inventDim.InventLocationId == inventLocation.InventLocationId;
а как в таком запросе посчитать количество результирующих строк?
в этом варианте RecId = 1, хотя на самом деле строк больше.
Старый 04.09.2012, 15:47   #7  
online
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от propeller Посмотреть сообщение
X++:
        select count (RecId) from inventTrans
        group by ItemId    
        join inventDim
        group by InventSizeId, InventLocationId, InventColorId
        where inventDim.inventDimId      == inventTrans.inventDimId &&
              inventDim.InventLocationId == inventLocation.InventLocationId;
а как в таком запросе посчитать количество результирующих строк?
Количество групп? Или суммарное количество строк во всех группах?
Если первое - то только перебором, если второе - то просто уберите все group by.

Цитата:
Сообщение от propeller Посмотреть сообщение
в этом варианте RecId = 1, хотя на самом деле строк больше.
Это количество строк в первой группе.

P.S.: Ещё, если очень хочется, то задачу рассчёта количества групп можно преобразовать в задачу подсчёта неповторяющихся строк, которую можно попытаться решить через notexists join.

Последний раз редактировалось S.Kuskov; 04.09.2012 в 16:05.
Старый 04.09.2012, 15:57   #8  
online
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Если это нужно для отрисовки индикатора сосояния процесса, то вместо того чтобы пытаться рассчитать число групп, можно в качестве общего числа итераций задать общее число строк во всех группах, а потом при прохождении каждой группы уеличивать счётчик пройденных итераций не на еденицу а на число строк в пройденной группе. Если число групп относительно велико и их размер более-менее однороден, то индикатор будет двигаться достаточно плавно.
За это сообщение автора поблагодарили: propeller (1).
Теги
count, exists, join, recid, select

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
2 while select или join? _scorp_ DAX: Программирование 9 23.01.2009 16:02
Select count(RecId) Упорядочить по возрастанию AxTimur DAX: Программирование 7 10.10.2008 15:22
Что лучше select RecId или select TableId Logger DAX: Программирование 9 02.06.2007 15:13
Fred Shen: Always use recId to know if a select statement returns a record Blog bot DAX Blogs 0 28.10.2006 16:40
select count(RecId) DreamCreator DAX: Программирование 10 02.08.2005 12:50

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 14:18.