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

Вниз

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

 
z_olga_al   (2003-02-02 16:10) [0]

орогие Мастера!
Простите за назойливость но...
Почему в этом запросе результат выполнения функции COUNT(A.COD_POST)
получается в виде произведения
( COUNT(A.COD_POST) *COUNT(B.COD_POST)) , а мне нужно получить
количество записей за период времени указанный в условии WHERE
и почему при выполнении обьединения по LEFT не выводятся записи которые
не совпадают за указанные периоды времени, т.е, записи присутствующие
в одной таблице и не присутствующие в другой хотя во всех книгах говорится,
что к записям одной таблицы, для которых не найдется ответных частей второй таблицы будут пристыкованы "пустые" записи второй таблицы.

SELECT A.KOD_POST,COUNT(A.KOD_POST),avg(A.p0003),avg(A.V0005),
B.KOD_POST,COUNT(B.KOD_POST),avg(B.p0003),avg(B.V0005)

FROM "ANALIZ.DB" A LEFT join "ANALIZ.DB" B ON (A.KOD_POST=b.kod_post)


where (A.DAT_PROB between "01.01.2002" and "31.12.2002") AND (B.DAT_PROB between "01.01.2001" and "31.12.2001")

group by A.KOD_POST,b.KOD_POST

С глубочайшим уважением

Ольга <z_olga_al@ukr.net>


 
Олег   (2003-02-02 17:52) [1]

Ответ на первый вопрос:
Допустим в твоей таблице в первом диапазоне дат 100 записей с A.KOD_POST = 1, а во втором диапазоне дат 10 записей с B.KOD_POST = 1. Тогда запрос для каждой из 100 записей из первого диапазона дат вернет все 10 записей из второго диапазона дат (ведь A.KOD_POST и B.KOD_POST совпадают). И когда ты сгруппируешь по A.KOD_POST, который везде равен 1, то получишь произведение 100*10=1000. Если ты хочешь, чтобы COUNT(A.KOD_POST) равнялся 100, то считай его отдельно в подзапросе, типа:
SELECT COUNT(C.KOD_POST) FROM "ANALIZ.DB" C WHERE (C.KOD_POST=A.KOD_POST) AND (C.DAT_PROB between "01.01.2002" and "31.12.2002"),
который вставь в основной запрос вместо COUNT(A.KOD_POST)

Ответ на второй вопрос:
Действительно, если JOIN-ить таблицы по LEFT, то запрос при отсутствии связанной записи во второй таблице вернет пустые поля. В твоем примере он это и делает, но ты отсекаешь эти записи вторым условием во WHERE, поскольку B.DAT_PROB тоже пустое и не может быть between чем-нибудь.



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

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

Наверх




Память: 0.47 MB
Время: 0.02 c
14-63752
aga
2003-02-05 20:54
2003.02.20
CHM


3-63533
Vick
2003-02-03 12:59
2003.02.20
Выбор всех чсловых значений которых нет в таблице...


14-63813
DelAlanPhi
2003-02-03 19:35
2003.02.20
Защита от копирования


3-63526
Толян
2003-02-03 11:40
2003.02.20
QReport, размещение.


14-63766
BOA_KAA
2003-02-03 15:17
2003.02.20
E-mail