Форум: "Базы";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Внизвопрос по 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.037 c