powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Непонятие с JOIN
10 сообщений из 10, страница 1 из 1
Непонятие с JOIN
    #39181518
Irmantas Simaitis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Задуман отчет с долгами по сроку с интервалами. С SQL несилен, потому запрос работает некоректно. Если отдельно, все select'ы работает, а с JOIN неполучается обединить в один запрос...

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SELECT A.CLIENT_CODE, A.CLIENT_NAME, B.DEBT, C.DELAYED, D.PAST_DUE, E.T15, F.T30, G.T45, H.T60, J.O60 
FROM CLIENT A 
LEFT JOIN (SELECT JOURNAL_CLIENT,SUM(JOURNAL_TOTAL) AS DEBT FROM JOURNAL GROUP BY JOURNAL_CLIENT) AS B
FULL OUTER JOIN (SELECT DOCUMENT_CLIENT, SUM(DOCUMENT _TOTAL-DOCUMENT_PAID) AS DELAYED FROM DOCUMENT WHERE (DOCUMENT _TYPE <> 1) AND ((DOCUMENT_DATE+DOCUMENT_DELAYED)>=CURRENT_DATE) GROUP BY DOCUMENT_CLIENT) AS C
LEFT JOIN (SELECT DOCUMENT_CLIENT, SUM(DOCUMENT _TOTAL-DOCUMENT_PAID) AS PAST_DUE FROM DOCUMENT WHERE (DOCUMENT _TYPE <> 1) AND ((CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED))>0) GROUP BY DOCUMENT_CLIENT) AS D
LEFT JOIN (SELECT DOCUMENT_CLIENT, SUM(DOCUMENT_TOTAL-DOCUMENT_PAID) AS T15 FROM DOCUMENT WHERE (DOCUMENT_TYPE <> 1) AND ((CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED))>0) AND ((CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED))<=15) GROUP BY DOCUMENT_CLIENT) AS E
LEFT JOIN (SELECT DOCUMENT_CLIENT, SUM(DOCUMENT_TOTAL-DOCUMENT_PAID) AS T30 FROM DOCUMENT WHERE (DOCUMENT_TYPE <> 1) AND ((CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED))>15) AND ((CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED))<=30) GROUP BY DOCUMENT_CLIENT) AS F
LEFT JOIN (SELECT DOCUMENT_CLIENT, SUM(DOCUMENT_TOTAL-DOCUMENT_PAID) AS T45 FROM DOCUMENT WHERE (DOCUMENT_TYPE <> 1) AND ((CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED))>30) AND ((CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED))<=45) GROUP BY DOCUMENT_CLIENT) AS G
LEFT JOIN (SELECT DOCUMENT_CLIENT, SUM(DOCUMENT_TOTAL-DOCUMENT_PAID) AS T60 FROM DOCUMENT WHERE (DOCUMENT_TYPE <> 1) AND ((CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED))>45) AND ((CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED))<=60) GROUP BY DOCUMENT_CLIENT) AS H
LEFT JOIN (SELECT DOCUMENT_CLIENT, SUM(DOCUMENT_TOTAL-DOCUMENT_PAID) AS O60 FROM DOCUMENT WHERE (DOCUMENT_TYPE <> 1) AND ((CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED))>60) GROUP BY DOCUMENT_CLIENT) AS J
ON A.CLIENT_CODE = B.JOURNAL_CLIENT 
ON A.CLIENT_CODE = C.DOCUMENT_CLIENT
ON A.CLIENT_CODE = D.DOCUMENT_CLIENT
ON A.CLIENT_CODE = E.DOCUMENT_CLIENT 
ON A.CLIENT_CODE = F.DOCUMENT_CLIENT
ON A.CLIENT_CODE = G.DOCUMENT_CLIENT
ON A.CLIENT_CODE = H.DOCUMENT_CLIENT
ON A.CLIENT_CODE = J.DOCUMENT_CLIENT 
ORDER BY A.CLIENT_NAME



С начало пока было меньше кода, запрос работал

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT A.CLIENT_CODE, A.CLIENT_NAME, B.DEBT, C.DELAYED
FROM CLIENT A 
LEFT JOIN (SELECT DOCUMENT_CLIENT, SUM(DOCUMENT _TOTAL-DOCUMENT_PAID) AS DELAYED FROM DOCUMENT WHERE (DOCUMENT _TYPE <> 1) AND ((DOCUMENT_DATE+DOCUMENT_DELAYED)>=CURRENT_DATE) GROUP BY DOCUMENT_CLIENT) AS C
FULL OUTER JOIN (SELECT JOURNAL_CLIENT,SUM(JOURNAL_TOTAL) AS DEBT FROM JOURNAL GROUP BY JOURNAL_CLIENT) AS B
ON A.CLIENT_CODE = C.DOCUMENT_CLIENT
ON A.CLIENT_CODE = B.JOURNAL_CLIENT 
ORDER BY A.CLIENT_NAME



Теперь везде возвращает null кроме А. Прошу помощи подсоединяя дополнительные select'ы, или так дела непоидут :)? По моему LEFT JOIN должен работать...
...
Рейтинг: 0 / 0
Непонятие с JOIN
    #39181527
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Irmantas Simaitis,

а если переписать из многократно вложенного "вертикального" списка в горизонтальный ?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
...
LEFT JOIN (SELECT JOURNAL_CLIENT,SUM(JOURNAL_TOTAL) AS DEBT FROM JOURNAL GROUP BY JOURNAL_CLIENT) AS B
ON A.CLIENT_CODE = B.JOURNAL_CLIENT

FULL OUTER JOIN (SELECT DOCUMENT_CLIENT, SUM(DOCUMENT _TOTAL-DOCUMENT_PAID) AS DELAYED FROM DOCUMENT WHERE (DOCUMENT _TYPE <> 1) AND ((DOCUMENT_DATE+DOCUMENT_DELAYED)>=CURRENT_DATE) GROUP BY DOCUMENT_CLIENT) AS C
ON A.CLIENT_CODE = C.DOCUMENT_CLIENT

...




и т.д. ?
...
Рейтинг: 0 / 0
Непонятие с JOIN
    #39181528
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Irmantas Simaitis,

такой запрос при значительном объёме данных будет дико тупить. Для начала попробуй заменить кучу своих LEFT JOIN на один с использованием CASE.

FULL OUTER JOIN до тройки лучше не использовать
...
Рейтинг: 0 / 0
Непонятие с JOIN
    #39181545
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или даже

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT ...  SUM(B.JOURNAL_TOTAL) AS DEBT, ....
FROM CLIENT A 

LEFT JOIN FROM JOURNAL B 
   ON B.JOURNAL_CLIENT = A.CLIENT_CODE

FULL.....
  ON...

GROUP BY A.CLIENT_CODE
ORDER BY A.CLIENT_NAME
...
Рейтинг: 0 / 0
Непонятие с JOIN
    #39181552
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
правка

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT ...  SUM(B.JOURNAL_TOTAL) AS DEBT, SUM(C.DOCUMENT_TOTAL-C.DOCUMENT_PAID) AS DELAYED, ....
FROM CLIENT A 

LEFT JOIN JOURNAL B 
   ON B.JOURNAL_CLIENT = A.CLIENT_CODE

FULL OUTER JOIN DOCUMENT C
  ON  A.CLIENT_CODE = C.DOCUMENT_CLIENT

...

WHERE (C.DOCUMENT_TYPE <> 1) AND ((C.DOCUMENT_DATE+C.DOCUMENT_DELAYED)>=CURRENT_DATE)
    AND (D.DOCUMENT _TYPE <> 1) AND ......

GROUP BY A.CLIENT_CODE
ORDER BY A.CLIENT_NAME
...
Рейтинг: 0 / 0
Непонятие с JOIN
    #39181560
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Irmantas Simaitis,

если разбивать твой ззапрос на части, то е тебя там например есть

Код: sql
1.
2.
3.
(SELECT DOCUMENT_CLIENT, SUM(DOCUMENT_TOTAL-DOCUMENT_PAID) AS T60 FROM DOCUMENT WHERE (DOCUMENT_TYPE <> 1) AND ((CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED))>45) AND ((CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED))<=60) GROUP BY DOCUMENT_CLIENT) AS H
LEFT JOIN (SELECT DOCUMENT_CLIENT, SUM(DOCUMENT_TOTAL-DOCUMENT_PAID) AS O60 FROM DOCUMENT WHERE (DOCUMENT_TYPE <> 1) AND ((CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED))>60) GROUP BY DOCUMENT_CLIENT) AS J
ON A.CLIENT_CODE = B.JOURNAL_CLIENT 



То есть ты объединяешь H и J по условию, в котором ни H ни J нет - и как это должно работать ?
...
Рейтинг: 0 / 0
Непонятие с JOIN
    #39181602
Irmantas Simaitis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AriochIrmantas Simaitis,

а если переписать из многократно вложенного "вертикального" списка в горизонтальный ?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
...
LEFT JOIN (SELECT JOURNAL_CLIENT,SUM(JOURNAL_TOTAL) AS DEBT FROM JOURNAL GROUP BY JOURNAL_CLIENT) AS B
ON A.CLIENT_CODE = B.JOURNAL_CLIENT

FULL OUTER JOIN (SELECT DOCUMENT_CLIENT, SUM(DOCUMENT _TOTAL-DOCUMENT_PAID) AS DELAYED FROM DOCUMENT WHERE (DOCUMENT _TYPE <> 1) AND ((DOCUMENT_DATE+DOCUMENT_DELAYED)>=CURRENT_DATE) GROUP BY DOCUMENT_CLIENT) AS C
ON A.CLIENT_CODE = C.DOCUMENT_CLIENT

...




и т.д. ?

Спасибо Arioch. Помогло...
...
Рейтинг: 0 / 0
Непонятие с JOIN
    #39181720
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Irmantas Simaitis,

а если без derived table (развернуть и убрать все "(SELECT ...") ?

если результаты совпадут, то можно буджет сравнивaть где лучше скорость
...
Рейтинг: 0 / 0
Непонятие с JOIN
    #39182109
someonesomeone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на ум приходит такое:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT A.CLIENT_CODE, MAX(A.CLIENT_NAME) CLIENT_NAME,
 (SELECT SUM(JOURNAL_TOTAL) AS DEBT FROM JOURNAL WHERE JOURNAL_CLIENT=A.CLIENT_CODE) DEBT,
 SUM(CASE WHEN CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED))<=0 THEN DOCUMENT_TOTAL-DOCUMENT_PAID END) DELAYED,
 SUM(CASE WHEN CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED))>0 THEN DOCUMENT_TOTAL-DOCUMENT_PAID END) PAST_DUE,
 SUM(CASE WHEN (CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED))>0 AND CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED)<=15 THEN DOCUMENT_TOTAL-DOCUMENT_PAID END) T15,
 SUM(CASE WHEN (CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED))>15 AND CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED)<=30 THEN DOCUMENT_TOTAL-DOCUMENT_PAID END) T30,
 SUM(CASE WHEN (CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED))>30 AND CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED)<=45 THEN DOCUMENT_TOTAL-DOCUMENT_PAID END) T45,
 SUM(CASE WHEN (CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED))>45 AND CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED)<=60 THEN DOCUMENT_TOTAL-DOCUMENT_PAID END) T60,
 SUM(CASE WHEN (CURRENT_DATE-(DOCUMENT_DATE+DOCUMENT_DELAYED))>60 THEN DOCUMENT_TOTAL-DOCUMENT_PAID END) O60
FROM CLIENT A FULL JOIN DOCUMENT C ON A.CLIENT_CODE = C.DOCUMENT_CLIENT AND C.DOCUMENT_TYPE <> 1
GROUP BY A.CLIENT_CODE
ORDER BY 2
...
Рейтинг: 0 / 0
Непонятие с JOIN
    #39182600
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
someonesomeone,

...а он больше сюда не придёт, мне кажется
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Непонятие с JOIN
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]