powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подсчет долгов по выписанным счетам
9 сообщений из 9, страница 1 из 1
Подсчет долгов по выписанным счетам
    #39550811
Greider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то я уперся и не понимаю, куда дальше двигаться, вроде совсем простой запрос (

Есть таблица `sht` - счета, и `pp` - платежные поручения. По каждому счету, которые находится в работе, может быть несколько платежных поручений, или ни одного.
Нужно выбрать счета, за которыми числится долг, т.е. сумма счета больше суммы поступивших по этому счету платежек.
Запрос:

Код: sql
1.
2.
3.
4.
5.
6.
SELECT 
SELECT sht.sht_no, client, status, sht_sum, SUM(pp.pl_sum)
FROM sht RIGHT JOIN pp USING(sht_no)
WHERE SHT.status > 0   #ну тут просто означает, что счет "в работе"
GROUP BY pp.sht_no      #вот тут вроде как нужна группировка для работы SUM, но если в таблице pp еще нет платежек по этим счетам, то получается они выпадают
HAVING SHT.sht_sum > SUM(pp.pl_sum)



выводит только те счета, по которым есть хотя бы один платеж.

Каким образом вывести также и те, по которым нет ни одной платежки?
...
Рейтинг: 0 / 0
Подсчет долгов по выписанным счетам
    #39550853
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Greider,

RIGHT замените на LEFT
...
Рейтинг: 0 / 0
Подсчет долгов по выписанным счетам
    #39550856
Greider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftGreider,
RIGHT замените на LEFT
Да я с LEFT и начинал на самом деле... результат идентичен.
...
Рейтинг: 0 / 0
Подсчет долгов по выписанным счетам
    #39550866
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
SELECT sht.sht_no, sht.client, sht.status, sht.sht_sum, COALESCE(SUM(pp.pl_sum),0)
FROM sht 
LEFT JOIN pp USING(sht_no)
WHERE sht.status > 0
HAVING sht.sht_sum > COALESCE(SUM(pp.pl_sum),0)


?
...
Рейтинг: 0 / 0
Подсчет долгов по выписанным счетам
    #39550912
Greider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хм... "Функция MySQL COALESCE возвращает первое ненулевое выражение в списке." А мне нужно наоборот, чтобы в список попадали и null-значения SUM. В таком виде результат 0 строк... Сделал пока два селекта и UNION (в таблице счетов есть некоторая избыточность в виде номера первой платежки, хотя это и не очень правильно наверно), работает удовлетворительно, хотя конечно одним сделать интересней...
...
Рейтинг: 0 / 0
Подсчет долгов по выписанным счетам
    #39550940
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Greider"Функция MySQL COALESCE возвращает первое ненулевое выражение в списке."
Где ты такой бред вычитал?
...
Рейтинг: 0 / 0
Подсчет долгов по выписанным счетам
    #39551031
Greider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaГде ты такой бред вычитал?
По первой выпавшей ссылке... сейчас вот тут почитал и понял, что имелось ввиду. Попробовал ещё раз - результат есть (за 6.48 секунды), но добавился всего один неоплаченный счет, а их около десятка... и то, если оставить строчку GROUP BY pp.sht_no. Без нее ничего не выводит...
...
Рейтинг: 0 / 0
Подсчет долгов по выписанным счетам
    #39551050
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жуть какая... а официальную документацию читать - не наш метод?
https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_coalesce Returns the first non-NULL value in the list, or NULL if there are no non-NULL values.

Greiderи то, если оставить строчку GROUP BY pp.sht_noДа, её я забыл вставить в код, а без неё SUM посчитает хрень.
Код: sql
1.
2.
3.
4.
5.
6.
SELECT sht.sht_no, sht.client, sht.status, sht.sht_sum, COALESCE(SUM(pp.pl_sum),0)
FROM sht 
LEFT JOIN pp USING(sht_no)
WHERE sht.status > 0
GROUP BY sht.sht_no /* , sht.client, sht.status, sht.sht_sum */
HAVING sht.sht_sum > COALESCE(SUM(pp.pl_sum),0)


И ещё мелочь - какой тип у полей sht.sht_sum и pp.pl_sum? Если не DECIMAL, то возможны определённые проблемы...
...
Рейтинг: 0 / 0
Подсчет долгов по выписанным счетам
    #39551094
Greider
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, огромное спасибо (в очередной раз)!

Действительно, дело было в GROUP BY! Надо было группировать и по номеру из sht, и из pp
Вот так всё работает как надо:

Код: sql
1.
2.
3.
4.
5.
SELECT sht.sht_no, sht.client, sht.status, sht.sht_sum, COALESCE(SUM(pp.pl_sum), 0) AS psum
FROM sht LEFT JOIN pp USING(sht_no)
WHERE sht.status > 0
GROUP BY pp.sht_no, sht.sht_no
HAVING sht.sht_sum > psum


Можно еще IFNULL как я понял использовать

p.s. да, поля с суммами все в DECIMAL
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Подсчет долгов по выписанным счетам
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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