![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
  | 
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Здравствуйте,  
		
	
		
		
			как сделать что бы из Набор Данных-считала поле пол в edit1.text и edit2.text количество полов ? так написала ... Код: 
	For i:=0 to Table1.RecordCount-1 do begin Table1.First; Table1.Fields.Fields[sex].Text:='Муж'; Table1.Fields.Fields[sex].Text:='Жен'; end; оно не работает ??? за ран спс. Последний раз редактировалось Admin, 16.08.2014 в 19:19.  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Тебе количество нужно узнать? сколько мужиков сколько женщин?? 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 На первый взгляд Table1.First в цикле возвращает указатель каждый раз на первую запись ( Next попробуйте), переменная цикла тоже не используется - просто крутится 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Код: 
	begin
Edit1.text:='0';
Edit2.text:='0';
for I := 1 to Table1.RecordCount do
begin
if table1.FieldByName('sex').Value='Man' then
edit1.text:=inttostr(strtoint(Edit1.text)+1);
end else
begin
edit2.text:=inttostr(strtoint(Edit2.text)+1);
end;
Table1.next;
end;Последний раз редактировалось Electronic_Arts, 16.08.2014 в 19:03.  | 
| Этот пользователь сказал Спасибо Electronic_Arts за это полезное сообщение: | ||
 
АНЯ17 (16.08.2014)
  | ||
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Тогда уж лучше так 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Код: 
	var
m, j: integer;
...
m:= 0;
j:= 0;
Table1.First;
while Table1.Eof do
begin
if Table1.FieldByName('sex').Value='Муж' then
Inc(m)
else
Inc(j);
Table1.next;
end;
Edit1.text:= IntToStr(m);
Edit2.text:= IntToStr(j); | 
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
 
АНЯ17 (16.08.2014)
  | ||
| 
		 
			 
			#6  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Пасибо, за ответ. Все работала  
		
	
		
		
		
		
		
		
			![]() Последний раз редактировалось АНЯ17, 16.08.2014 в 20:50.  | 
| 
		 
			 
			#7  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 Запрос который посчитает все и сразу 'SELECT COuNT(SEX) from имя таблицы group by SEX' -запрос будет корректен если в вашей таблице нет повторяющихся людей. Никаких ластов , фирстов и циклов не надо  | 
| 
		 
			 
			#8  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Цитата: 
	
 Пользуйте только Query Но 2е циферки все же однозначно не дают понять сколько "м", а сколько "ж" Добавим WHERE Код: 
	SELECT COUNT(sex) FROM <имя таблицы> WHERE sex = "муж" GROUP BY sex  | 
| 
		 
			 
			#9  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Ох уж эти советчики. Даже запрос правильный дать не могут. 
		
	
		
		
		
		
		
	
		
		
	
	
	Код: 
	SELECT Sex, COUNT(Sex) FROM <имя таблицы> GROUP BY Sex Еще вариант - использовать компоненты, которые позволяют автоматически посчитать подобную статистику, например cxGrid из набора DevExpress. Ну и кодом, как предложил Alegun. Ну и желательно в таком коде запоминать положение курсора и восстанавливать его после окончания подсчета.  | 
| 
		 
			 
			#10  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Цитата: 
	
 ![]()  | 
| 
		 
			 
			#11  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Код: 
	SELECT podra, sex, count(*) as C FROM roj WHERE d_reg between :f and :j GROUP BY podra, sex ORDER BY 1, 2' Я хотела бы из поля (с) результаты кол-во полов с подразделение указать(вынести) в Edit1.text и Edit2.text. Например Октябрьский район Муж=1 в(Edit1.text) и Жен=1 в (Edit2.text ) и дале Первомайский р. Муж=3 в(Edit3.text). . . и.т.д и в итоге должна получатся так Октябрьский район Муж.1 Жен.1  | 
| 
		 
			 
			#12  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Делай селект из подселекта. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#13  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Ага, а тут гораздо интереснее. Т.е. теперь нам надо развернуть вертикальную таблицу в горизонтальную (наверное, не совсем точное описание, скажем так, надо объединить строки для одинакового отдела в одну). Действительно, это можно сделать с помощью запроса из запроса, НО я советую делать это с построением view, т.к. это будет, наверное, эффективнее. 
		
	
		
		
		
		
		
	
		
		
	
	
	1. Создаем вью из твоего запроса: Код: 
	create view roj_sex as select podra, sex, count(*) as c from roj group by podra, sex; 2. А теперь пишем запрос, который собирает данные в одну кучку: Код: 
	select podra, sum(case when sex = 'mal' then C else 0 end) as c_mal, sum(case when sex = 'fem' then C else 0 end) as c_fem from roj_sex group by podra; Пример результата: Код: 
	PODRA | C_MAL | C_FEM -------+-------+------- podr | 1 | 1 PS. сорри, на этой системе русского языка нет. так что пришлось по английски писать пол.  | 
| 
		 
			 
			#14  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 c основой этой запросик оно 100% работает как надо только, но Первомайский район. . . Для нахождения других районов хм  
		
	
		
		
		
		
		
	
		
		
	
	
	Код: 
	SELECT podra, sex, count(*) as C FROM roj WHERE d_reg between :f and :j GROUP BY podra, sex ORDER BY 1, 2' Код: 
	 var
 Ap,xl,sv,sm,podr1,podr2,C: Variant;// peremeni sv = пол жен sm = пол муж
   i: integer;
    f,j : TdateTime;
   rc,p,q : Integer;
   mypodra, sex : string;Код: 
	db.AdsQueryStatistic.First;
rc := db.AdsQueryStatistic.RecordCount;
//mypodra:='Октябрьский район';// 
mypodra:='Первомайский район';
for i:=0 to rc do //а ты уверена что с 1 а не с 0, я просто сейчас не могу проверить
begin
  if db.AdsQueryStatistic.FieldByName('podra').Value = mypodra then
  begin
     sex:=db.AdsQueryStatistic.FieldByName('sex').Value;
     p:=db.AdsQueryStatistic.FieldByName('C').Value;
     if sex = 'Жен' then
     begin
        Ap.Range['b2'] := p;
  //      Ap.Range['b3'] := p;
       // continue;
     end;
     if sex = 'Муж' then
     begin
        Ap.Range['c2'] := p;
    //    Ap.Range['c3'] := p;
       // break;
     end;
  end;
  db.AdsQueryStatistic.next;
end;Для нахождения других районов ??? не знаю пока А что надо делать с Октябрьский район ???? // Ap.Range['b3'] := p;??? за ран спс.  | 
| 
		 
			 
			#15  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 Правильный запрос и понимание работы GROUP BY и ORDER BY гораздо проще решит вашу задачу без колдовства с before и прочим: Код: 
	db.sql.tex:=' SELECT podra,sex, count(sex) FROM roj GROUP BY sex,podra ORDER BY podra ' db.active:=true; Район - Пол - Количество - Октябрьский / муж / 1000 - Октябрьский / жен / 200 - Петровский / муж / 300 - Петровский / жен / 2000 И т д. GROB BY сгруппирует сначало по полу потом по району, ORDER BY упорядочит все ваши записи по району. Далее в цикле: Код: 
	while not db.Eof do //Ложь- когда цикл будет на последней строчке таблицы,если запрос ничего не вернет в цикл не зайдет begin//С таким циклом не надо никаких First и last db.fields[0].asstring //- тут ваш район db.fields[1].asstring //- тут пол для конкретного района db.fields[2].asstring //- тут количество по конкретному полу и району db.next;//Я надеюсь что в ваших районах всегда хотя бы по 1 мужчине и женщине есть..поэтому //строки в таблице всегда будут парными =) end; db.sql.tex:=' SELECT podra,sex, count(sex) FROM roj WHERE podra= UPPER('+quotedstr(Ansiuppercase('Октябрьский'))+') GROUP BY sex,podra ORDER BY podra' db.active:=true; quotedstr- Это операнд апострофов, код готов для вставки в Delphi =) UPPER-Изменяет регистр букв.. для SQL чтоб уж 100% =) Ansiuppercase()-Изменяет регистр букв для String.. чтоб уж 100% =) Так гораздо проще и не надо извращаться с циклами и лишними условиями и писать можее сразу в Excel без кучи левых переменных. Да и вообще судя по фото ,что вы хотите получить..достаточно привязать это сразу к DbGird без всяких циклов..только использование Last First уже обязательно,иначе выведет не все строки P/S Код писал сразу на форуме,поэтом синтаксические ошибки не исключены) Последний раз редактировалось Heneken, 08.09.2014 в 14:50.  | 
![]()  | 
		
	
		
  | 
	
| Опции темы | Поиск в этой теме | 
| Опции просмотра | |
		
  | 
	
		
  |