Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

вопрос по SQL !!!


lena ©   (2004-03-13 16:11:00) 

Добрый день, мастера! Помогите пожалуйста!
Вопрос по SQL  Есть таблица  table(id, person,BirthData)

Задается период: dataBeg - dataEnd
в результате запроса нужно получить выборку : количество персон, у которых день рождения в первый день периода, во второй,... в последний день.
Можно ли это сделать в одном запросе?


Johnmen   (2004-03-14 01:24:00) [1]

Всё можно одним запросом. Но пока не указан тип СУБД, увы...


Vemer   (2004-03-13 21:14:00) [2]

Неужели во всей Бд нет таблицы из которой можно сделать типа
Select Distinct Date_Field From Table_X+ Left Join из [3].


YurikGl   (2004-03-13 19:25:00) [3]

Если у тебя одновременно один пользователь пользуется программой, то создай постоянную таблицу типа SwapTable, наполняй ее своими данными, потом строй к ней запрос. Не забудь перед заполнением ее очистить.

Если одновременно может обращаться много пользователей, то тебе необходимо сгенерировать уникальное имя таблицы, затем ее создать, наполнить, использовать и удалить

Я для генерации уникального имени написал функцию

Function TFormSborkaOtchet.GetNewTableName:ShortString;
var
st:shortString;
Buffer:array[0..255] of char;
size:dword;
Begin
st:='SwapTable'+IntToStr(random(10000));
size:=MAX_COMPUTERNAME_LENGTH;
if GetComputerName(buffer, size) then st:=st+string(buffer)
                                else st:=st+IntToStr(random(10000));
size:=120;
if GetUserName(buffer,size) then st:=st+string(buffer)
                           else st:=st+IntToStr(random(10000));
GetNewTableName:=st;
End;

потом что-то вроде

   while i<20 do
   try
     TableVrName:=GetNewTableName;
     ADOCommand1.CommandText:='Create Table '+TableVrName+' ([Id] integer, [Количество] integer)';
     ADOCommand1.Execute;
     i:=21
   except      
     inc(i)
   end;
   if i=20 then begin
     Raise Exception.Create('Таблица создана не была');
     TableVrName:='';
                 end;

далее присоединяемя к ней

   ADODataSet2.Active:=false;
   ADODataSet2.CommandText:=TableVrNameVP;
   ADODataSet2.Active:=true;

Сразу скажу. Этот способ почему-то великолепно работал у меня в Access2000, но почему-то не прошел на другом компьютере. Почему - сейчас разбираюсь.

Вообще не использовать "физические" таблицы  принципиально можно, если связаться со списками, написать процедуры поиска и запросов для них. Но, я думаю, тебе это не нужно.


lena   (2004-03-13 19:12:00) [4]

хорошо, у меня тогда такой вопрос: Как создать на лету такую табличку, чтобы  заполнить ее датами и сделать выборки. Т е чтобы не создавать такую таблицу физически


YurikGl   (2004-03-13 18:19:00) [5]

Лобовое решение

Создаешь таблицу типа

T1(дата, количество). Сначала заполняешь фиктивно вводишь каждую дату и количество=0. Потом в эту таблицу пихаешь записи типа дата, количество=1 для каждой записи table(id, person,BirthData)

Далее Select ... sum(количество)... Group by дата.

По моему, должно сработать.


lena   (2004-03-13 18:14:00) [6]

податно! на каждую дату заданного промежутка!


YurikGl   (2004-03-13 17:45:00) [7]

Тебе надо что-бы отображались промежутки и количество рожденных в них? или податно?


lena   (2004-03-13 17:29:00) [8]

я думала создать временный датасет, в котором и будут перечислены все даты и дальше делать, как ты говоришь
но умные люди сказали, что они уверены, что можно сделать в одном запросе и быстро ушли.  
Неужели нельзя ??  Может можно какое-то фихтивное поле на лету создать,  в которое поместить все даты и сгруппировать по нему...


Vemer   (2004-03-13 17:24:00) [9]

А как по твоему запрос выведет эту дату, если ее в таблице нет? Как вариант - надо создать таблицу со всеми датами и к ней Left Join делать из таблицы с днями рождения. (Кстати такую выборку можно из како-нибудь др. таблицы получить, где все даты точно есть..)


lena   (2004-03-13 16:33:00) [10]

да,-- это работает! спасибо большое!! Но я ломаю голову, как сделать чтобы выводился весь список по всем (!) датам этого периода. Т.е. если в какую-то дату,к примеру, никто не родился, она все равно бы вывелась, а количество рожденных соответстенно равнялось бы  0


Desdechado   (2004-03-13 16:15:00) [11]

select count(id) from tbl
where birthdata between databeg and dataend
group by birthdata

это если в поле birthdata только дата, а не дата-время


Наверх

Титульная страница Поиск, карта сайта Написать письмо