Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL запрос с несколькими таблицами с несоответствием... [D5, IB6.x]


Alexsys ©   (2002-10-03 18:34:00) 

Народ, помогите, пожалуйста запрос построить... Никак не получается...
В базе куча таблиц, мне нужны 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 )
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
В результате получаю выборку, в которой нет клиентов, у которых не было ни одного платежа, а надо бы, чтобы стоял 0. Как бы мне это прописать?
И еще: как бы убрать из этой выборки клиентов, которые есть в таблице ULICDOP?


Alexsys   (2002-10-04 18:54:00) [1]

:-) Не похоронили. Выкрутился через создание новой таблички, в которую напихал то, что хотел. Криво, но работает.
Всем спасибо большое. Переделаю заново.


NDeu   (2002-10-04 10:24:00) [2]

Если уже не похоронили попробуй это:
(твой 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)


Johnmen   (2002-10-04 09:56:00) [3]

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)
LEFTJOIN 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В


Alexsys   (2002-10-04 09:36:00) [4]

В базе данные по всем месяцам, мне нужны за сентябрь...
Если они есть - тогда значение - сумма, если таких нет - то 0!
Например:
ID NAME VSEGO(USHET) VSEGO(UPLAT)
------------------------------------------
1 Завод 12345,67 11111,11 - Есть платежи в сентябре
...
55 Фабрика 999,99 0,00 - Нет платежей в сентябре

Такое можно сделать? Очень нужно...


ЮЮ   (2002-10-04 05:43:00) [5]

WHERE (Licacc.PRZZ = "U")
AND (Ushet.MM = 9)
AND (Ushet.YY = 2002)
AND (Uplat.MM = 9)
AND (Uplat.YY = 2002)

Как же они останутся в выборке, если они отсекаются условием выборки?


Alexsys   (2002-10-03 22:02:00) [6]

Неужели никто не подскажет?
Тады ой! Меня похоронят завтра... Подскажите хоть какой-нибудь выход..


Alexsys   (2002-10-03 19:50:00) [7]

LEFT тоже не помогает. Та же история. Если нет хотя бы одной записи в UPLAT - этого клиента в выборке нет, а нужен со значением 0!
За ULICDOP - большое спасибо.


Lar   (2002-10-03 19:28:00) [8]

У Вас, судя по запросу, каждой строке таблицы LICACC соответствует одна (и только одна) строка таблицы ULICACC. Если это не так, то я чего-то не понял.
Если это так, то (не вдаваясь в рассуждения, насколько удачно такое деление) в секции FROM нужно заменить "INNER" на "LEFT", а в секции WHERE нужно добавить условие AND (not exists (select * from ULICDOP where ULICDOP.IDCLIENT=LICACC.ID))


Наверх

Титульная страница Поиск, карта сайта Написать письмо