Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подчитать количество записей, Помогите пожалуста, написать SQL запрос 
V
    Опции темы
RinOSpro
Дата 10.9.2007, 12:26 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Помогите пожалуста, написать SQL запрос.

есть таблица "Контролеры" 

КодКонтр | КолвоАбонентов |
1        |                |
2        |                |
3        |                |

и таблица "Абоненты" 

НомерАб  |    Абонент     |   КодКонтр   |
1              |иванов           |       1             |
2              |петров           |       2             |
3              |сидоров         |       1             |
4              |козлов            |       1             |
5              |березов          |       3            |
6              |осинов            |       3            |

Нужно в поле Контролеры.КолвоАбонентов посчитать сколько абонентов на каждом контролёре 

если вот сейчас в ручную посчитать то получиться что 

КодКонтр | КолвоАбонентов |
1               |        3                   |               3 абонентов на этом контролере
2               |        1                   |              1 абонент на этом контролере
3               |        2                   | 2 абонентов на этом контролере

Я написал процедуру чтобы считало перебором recordcount но это сплошной глюк работает через раз.
Помогите пожалуста написать SQL запрос!

Добавлено через 52 секунды
таблица Абоненты связана с таблицей Контролеры по полю КодКонтр   
  Вверх
Savek
Дата 10.9.2007, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 10.4.2006
Где: Воронеж

Репутация: 7
Всего: 7



Зачем нужна таблица Контроллеры? Это же результат группировки таблицы Абоненты,
а запрос такой

Код

select КодКонтр,Count(Абонент) from Абоненты group by КодКонтр

PM MAIL   Вверх
RinOSpro
Дата 10.9.2007, 12:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











В таблице контролеры храняться записи о контролерах. каждый контролер отвечает за своего абонента для того чтобы получить доступ к абоненту нужно сначало выбрать контролера за которым этот абонент закреплен.Savek  - этот запрос не подходит мне нужно почитать сколько абонентов на каждом контролере.
  Вверх
Akina
Дата 10.9.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



RinOSpro, Ты походу сам еще не понимаешь, что именно тебе надо... запрос, который написАл Savek, как раз СЧИТАЕТ количество абонентов "на каждом контролере".
Может, тебе надо еще ЗАПИСАТЬ эти подсчитанные данные в таблицу "Контролеры"? Или еще что-то? ну так сформулируй, что же тебе нужно-то...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
RinOSpro
Дата 10.9.2007, 14:03 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Да знаю что мне надо вот как я уже делаю:

Код

procedure TForm6.CountAbonInKontr;
var
  i : integer;
  KontrTbl, AbnonTbl : TDataSet;
  LocOpt : TLocateOptions;
begin
try
  KontrTbl := DataModule2.DataSource14.DataSet;
  Abnontbl := DataModule2.DataSource1.DataSet;

  LocOpt := [loCaseInsensitive,loPartialKey];

  KontrTbl.Locate('ÔÈÎÊîíòðîëåðà','ÂÑÅ', LocOpt);
  KontrTbl.Edit;
  KontrTbl.FieldByName('Êîëè÷åñòâîÀáîíåíòîâ').AsInteger := AbnonTbl.RecordCount;
  KontrTbl.Post;

  AbnonTbl.Active := False;
  (AbnonTbl as TADOTable).MasterSource := DataModule2.DataSource14;
  (AbnonTbl as TADOTable).MasterFields := 'ÊîäÊîíòðîëåðà';
  (AbnonTbl as TADOTable).IndexFieldNames := 'ÊîäÊîíòðîëåðà';
  AbnonTbl.Active := True;

  KontrTbl.First;
  AbnonTbl.First;

for i := 0 to KontrTbl.RecordCount do
  begin
    KontrTbl.Next;
    KontrTbl.Edit;
    KontrTbl.FieldByName('Êîëè÷åñòâîÀáîíåíòîâ').AsInteger := AbnonTbl.RecordCount;
  end;

AbnonTbl.First;
KontrTbl.First;

except
Exit;
end;
end;


Добавлено через 1 минуту и 42 секунды
Может, тебе надо еще ЗАПИСАТЬ эти подсчитанные данные в таблицу "Контролеры"? да именно это и нужно
  Вверх
Savek
Дата 10.9.2007, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 10.4.2006
Где: Воронеж

Репутация: 7
Всего: 7



Цитата(RinOSpro @  10.9.2007,  14:03 Найти цитируемый пост)
Может, тебе надо еще ЗАПИСАТЬ эти подсчитанные данные в таблицу "Контролеры"? да именно это и нужно


Код

Query1.SQL.Text:='select КодКонтр,Count(Абонент) as qty from Абоненты group by КодКонтр';
Query1.open;

Query2.SQL.text:='Update Kontroler set КолвоАбон=:p1 where КодКонтр=:p2';
Query2.Prepared:=True;

While not Query1.Eof do begin
    Query2.Parameters.ParamByName('p1').Value:=Query1.FieldByName('qty').Integer;    
    Query2.Parameters.ParamByName('p2').Value:=Query1.FieldByName('Кодконтр').Integer;
    Query2.ExecSQL;
    Query1.Next;
end;


PM MAIL   Вверх
Anark1
Дата 10.9.2007, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 622
Регистрация: 15.12.2006
Где: RF -> Moscow

Репутация: 1
Всего: 11



Цитата(RinOSpro @ 10.9.2007,  14:03)
Да знаю что мне надо вот как я уже делаю:

Код

procedure TForm6.CountAbonInKontr;
var
  i : integer;
  KontrTbl, AbnonTbl : TDataSet;
  LocOpt : TLocateOptions;
begin
try
  KontrTbl := DataModule2.DataSource14.DataSet;
  Abnontbl := DataModule2.DataSource1.DataSet;

  LocOpt := [loCaseInsensitive,loPartialKey];

  KontrTbl.Locate('ÔÈÎÊîíòðîëåðà','ÂÑÅ', LocOpt);
  KontrTbl.Edit;
  KontrTbl.FieldByName('Êîëè÷åñòâîÀáîíåíòîâ').AsInteger := AbnonTbl.RecordCount;
  KontrTbl.Post;

  AbnonTbl.Active := False;
  (AbnonTbl as TADOTable).MasterSource := DataModule2.DataSource14;
  (AbnonTbl as TADOTable).MasterFields := 'ÊîäÊîíòðîëåðà';
  (AbnonTbl as TADOTable).IndexFieldNames := 'ÊîäÊîíòðîëåðà';
  AbnonTbl.Active := True;

  KontrTbl.First;
  AbnonTbl.First;

for i := 0 to KontrTbl.RecordCount do
  begin
    KontrTbl.Next;
    KontrTbl.Edit;
    KontrTbl.FieldByName('Êîëè÷åñòâîÀáîíåíòîâ').AsInteger := AbnonTbl.RecordCount;
  end;

AbnonTbl.First;
KontrTbl.First;

except
Exit;
end;
end;


Добавлено @ 14:05
Может, тебе надо еще ЗАПИСАТЬ эти подсчитанные данные в таблицу "Контролеры"? да именно это и нужно

Насколько я вижу тут и не идет речи об SQL. Такой код пригоден для малого количества записей.
Методы Locate, SetKey и другие просто перебирают весь рекордсет. А если в таблице >1 000 000 записей ? 
Их допустимо использовать уже после выборки SQL.


--------------------
Enjoy yourself, still you can...;)

user posted image

user posted image
PM MAIL ICQ   Вверх
Vas
Дата 11.9.2007, 06:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Вот так на SQL в БД Oracle работает.
Код

insert into controler (code, count_code)
select code, count(*) as count_code from abon
group by code




--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Deniz
Дата 11.9.2007, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Vas, какой insert? Ему update нужен.
Возможно подойдет 
Код

Update Kontroler k set k.КолвоАбон = (select Count(Абонент) from Абоненты where КодКонтр=k.КодКонтр)
 попробуй, может получится.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Savek
Дата 12.9.2007, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 10.4.2006
Где: Воронеж

Репутация: 7
Всего: 7



Цитата(Deniz @  11.9.2007,  14:33 Найти цитируемый пост)
Код    
Update Kontroler k set k.КолвоАбон = (select Count(Абонент) from Абоненты where КодКонтр=k.КодКонтр)

Разве такие запросы могут в принципе выполняться? Откуда вложенный запрос может знать что такое k.kodkontr?
PM MAIL   Вверх
Akella
Дата 12.9.2007, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



думаю, что может
PM MAIL   Вверх
Savek
Дата 12.9.2007, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 10.4.2006
Где: Воронеж

Репутация: 7
Всего: 7



Цитата(Akella @  12.9.2007,  09:09 Найти цитируемый пост)
думаю, что может

Попробовал, на Accesse не проходит: "Введите значение параметра", что в общем то и ожидалось

PM MAIL   Вверх
Akella
Дата 12.9.2007, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



а ты попробуй на FireBird`е
PM MAIL   Вверх
Savek
Дата 12.9.2007, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 10.4.2006
Где: Воронеж

Репутация: 7
Всего: 7



Да... Сколько баз, столько диалектов, не думал что могут быть такие принципиальные отличия. 
Попробовать не могу нет FB под рукой

Кстати автор до сих пор не признался с какой базой работает?

Это сообщение отредактировал(а) Savek - 12.9.2007, 16:18
PM MAIL   Вверх
Deniz
Дата 13.9.2007, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(Savek @  12.9.2007,  13:58 Найти цитируемый пост)
Попробовал, на Accesse не проходит ...

Все вопросы к M$  smile
возможно они когда-нибудь доделают Access до вида нормальной СУБД   smile 
хотя зачем им это? есть же MSSQL ...


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0610 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.