Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.026 c
14-1082296866
q13
2004-04-18 18:01
2004.04.11
задача:распределить число между элементами массива


1-1082613339
Alexey
2004-04-22 09:55
2004.04.11
Файлы


14-1079286422
Kamerad
2004-03-14 20:47
2004.04.11
HELP!


3-1079074744
lats
2004-03-12 09:59
2004.04.11
Обновление данных в SQL запросе на IB


14-1079713798
Chcnger
2004-03-19 19:29
2004.04.11
задача




   Наверх