![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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. |
![]() |
|
|
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|
|