|  22.09.2009, 12:54 | #1 | 
| Участник | 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 | 
| Участник | 
			
			группируйте по DataAreaId или TableId
		 | 
|  | 
|  22.09.2009, 13:06 | #3 | 
| Участник | 
			
			Спасибо, помогло! На самом деле у меня три join, в каждом вставил group by TableId и запрос стал выполняться. | 
|  | 
|  22.09.2009, 13:37 | #4 | 
| Участник | 
			
			Делайте exists join, иначе найдете неверное количество записей в основной таблице.
		 
				__________________ // no comments | 
|  | 
|  22.09.2009, 14:02 | #5 | 
| Участник | 
			
			Синтаксис вида 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" 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 | 
| Участник | 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 | 
| Участник | Цитата: 
		
			Сообщение от 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. Это количество строк в первой группе. P.S.: Ещё, если очень хочется, то задачу рассчёта количества групп можно преобразовать в задачу подсчёта неповторяющихся строк, которую можно попытаться решить через notexists join. Последний раз редактировалось S.Kuskov; 04.09.2012 в 16:05. | 
|  | 
|  04.09.2012, 15:57 | #8 | 
| Участник | 
			
			Если это нужно для отрисовки индикатора сосояния процесса, то вместо того чтобы пытаться рассчитать число групп, можно в качестве общего числа итераций задать общее число строк во всех группах, а потом при прохождении каждой группы уеличивать счётчик пройденных итераций не на еденицу а на число строк в пройденной группе. Если число групп относительно велико и их размер более-менее однороден, то индикатор будет двигаться достаточно плавно.
		 | 
|  | |
| За это сообщение автора поблагодарили: propeller (1). | |