Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.48 MB
Время: 0.041 c
8-1076327721
pai
2004-02-09 14:55
2004.04.11
ЗВУК И СЕТЬ


11-1065951758
Revolter
2003-10-12 13:42
2004.04.11
прозрачность


14-1082064425
Asteroid
2004-04-16 01:27
2004.04.11
3D shooter в 96KB. Кто меньше? :)


1-1079930272
Driver
2004-03-22 07:37
2004.04.11
Как реализовать?


6-1079116891
KyRo
2004-03-12 21:41
2004.04.11
В чем ошибка конекта в WinSock





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский