![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
вопрос по 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 только дата, а не дата-время