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