Форум: "Базы";
Текущий архив: 2002.10.28;
Скачать: [xml.tar.bz2];
ВнизSQL запрос с несколькими таблицами с несоответствием... Найти похожие ветки
← →
Alexsys (2002-10-03 18:34) [0]Народ, помогите, пожалуйста запрос построить... Никак не получается...
В базе куча таблиц, мне нужны 5 из них:
LICACC (ID, PRIZN ...) - клиенты (физлица и юрлица)
ULICACC (IDCLIENT, NAME ...) - анкеты клиентов - юрлиц
USHET (IDCLIENT, MM, YY, VSEGO ...) - начисления юрлицам
UPLAT (IDCLIENT, MM, YY, VSEGO ...) - платежи юрлиц
ULICDOP (IDCLIENT...) - ненужные клиентыКаждый месяц у клиентов по несколько начислений и платежей.
Пишу вот такой запрос:
SELECT Licacc.ID, Ulicacc.NAME, SUM( Ushet.VSEGO ), SUM( Uplat.VSEGO )
В результате получаю выборку, в которой нет клиентов, у которых не было ни одного платежа, а надо бы, чтобы стоял 0. Как бы мне это прописать?
FROM LICACC Licacc
INNER JOIN ULICACC Ulicacc
ON (Licacc.ID = Ulicacc.IDCLIENT)
INNER JOIN USHET Ushet
ON (Licacc.ID = Ushet.IDCLIENT)
INNER JOIN UPLAT Uplat
ON (Licacc.ID = Uplat.IDCLIENT)
WHERE (Licacc.PRZZ = "U")
AND (Ushet.MM = 9)
AND (Ushet.YY = 2002)
AND (Uplat.MM = 9)
AND (Uplat.YY = 2002)
GROUP BY Licacc.ID, Ulicacc.NAME
ORDER BY Ulicacc.NAME
И еще: как бы убрать из этой выборки клиентов, которые есть в таблице ULICDOP?
← →
Lar (2002-10-03 19:28) [1]У Вас, судя по запросу, каждой строке таблицы LICACC соответствует одна (и только одна) строка таблицы ULICACC. Если это не так, то я чего-то не понял.
Если это так, то (не вдаваясь в рассуждения, насколько удачно такое деление) в секции FROM нужно заменить "INNER" на "LEFT", а в секции WHERE нужно добавить условие AND (not exists (select * from ULICDOP where ULICDOP.IDCLIENT=LICACC.ID))
← →
Alexsys (2002-10-03 19:50) [2]LEFT тоже не помогает. Та же история. Если нет хотя бы одной записи в UPLAT - этого клиента в выборке нет, а нужен со значением 0!
За ULICDOP - большое спасибо.
← →
Alexsys (2002-10-03 22:02) [3]Неужели никто не подскажет?
Тады ой! Меня похоронят завтра... Подскажите хоть какой-нибудь выход..
← →
ЮЮ (2002-10-04 05:43) [4]WHERE (Licacc.PRZZ = "U")
AND (Ushet.MM = 9)
AND (Ushet.YY = 2002)
AND (Uplat.MM = 9)
AND (Uplat.YY = 2002)
Как же они останутся в выборке, если они отсекаются условием выборки?
← →
Alexsys (2002-10-04 09:36) [5]В базе данные по всем месяцам, мне нужны за сентябрь...
Если они есть - тогда значение - сумма, если таких нет - то 0!
Например:
ID NAME VSEGO(USHET) VSEGO(UPLAT)
------------------------------------------
1 Завод 12345,67 11111,11 - Есть платежи в сентябре
...
55 Фабрика 999,99 0,00 - Нет платежей в сентябре
Такое можно сделать? Очень нужно...
← →
Johnmen (2002-10-04 09:56) [6]SELECT , Ulicacc.NAME, SUM( Ushet.VSEGO ), SUM( Uplat.VSEGO )
FROM LICACC Licacc
JOIN ULICACC Ulicacc
ON (Licacc.ID = Ulicacc.IDCLIENT)
INNER JOIN USHET Ushet
ON (Licacc.ID = Ushet.IDCLIENT)
LEFT JOIN UPLAT Uplat
ON (Licacc.ID = Uplat.IDCLIENT)
WHERE (Licacc.PRZZ = "U")
AND (Ushet.MM = 9)
AND (Ushet.YY = 2002)
AND (Uplat.MM = 9)
AND (Uplat.YY = 2002)
AND (NOT EXISTS
(SELECT ULICDOP.IDCLIENT FROM ULICDOP
WHERE ULICDOP.IDCLIENT = Licacc.ID))
GROUP BY Licacc.ID, Ulicacc.NAME
ORDER BY Ulicacc.NAMEВ
← →
NDeu (2002-10-04 10:24) [7]Если уже не похоронили попробуй это:
(твой select)
Union
SELECT Licacc.ID, Ulicacc.NAME, 0, 0
from Licacc
left JOIN ULICACC Ulicacc
ON (Licacc.ID = Ulicacc.IDCLIENT)
where Licacc.ID not in (твой select)
← →
Alexsys (2002-10-04 18:54) [8]:-) Не похоронили. Выкрутился через создание новой таблички, в которую напихал то, что хотел. Криво, но работает.
Всем спасибо большое. Переделаю заново.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.10.28;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c