Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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 )
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?


 
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.57 MB
Время: 0.034 c
8-92618
Andrey Verevkin
2002-06-28 07:46
2002.10.28
Topenpicturedialog and TImage


7-92773
Mashinist
2002-08-16 10:34
2002.10.28
Фай по модему


4-92821
Пенсионер
2002-09-13 12:35
2002.10.28
Помогите ламеру осуществить хитрый перехват нажатие кнопки?


3-92324
wHammer
2002-10-05 11:09
2002.10.28
Как программно установить NET DIR для Paradox?


7-92759
ZiX
2002-08-22 16:57
2002.10.28
Как узнать серийный номер СД диска?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский