|
|
Регистрация | << Правила форума >> | 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. Ну и желательно в таком коде запоминать положение курсора и восстанавливать его после окончания подсчета. |
#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
|
||||
|
||||
Делай селект из подселекта.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#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. |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|
|