Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

вопрос по SQL !!!   Найти похожие ветки 

 
lena   (2004-03-13 16:11) [0]

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

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


 
Desdechado ©   (2004-03-13 16:15) [1]

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

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


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

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


 
Vemer ©   (2004-03-13 17:24) [3]

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


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

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


 
YurikGl ©   (2004-03-13 17:45) [5]

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


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

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


 
YurikGl ©   (2004-03-13 18:19) [7]

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

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

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

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

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


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

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


 
YurikGl ©   (2004-03-13 19:25) [9]

Если у тебя одновременно один пользователь пользуется программой, то создай постоянную таблицу типа 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, но почему-то не прошел на другом компьютере. Почему - сейчас разбираюсь.

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


 
Vemer ©   (2004-03-13 21:14) [10]

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


 
Johnmen ©   (2004-03-14 01:24) [11]

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



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.031 c
6-1075646902
grifff
2004-02-01 17:48
2004.04.11
IdSNMP


3-1081938856
Hazg
2004-04-14 14:34
2004.04.11
Создание базы через Query в кодировке 866


4-1075386758
_hunter_
2004-01-29 17:32
2004.04.11
как добавить пользователя в группу


14-1082102280
Dmitriy O.
2004-04-16 11:58
2004.04.11
Предлагаю заценить прогу


4-1076071430
dik
2004-02-06 15:43
2004.04.11
TRichEdit