Использование SELECT внутри SELECT возвращает ноль - PullRequest
0 голосов
/ 11 апреля 2019

В настоящее время я пытаюсь сгенерировать список платежей, причитающихся членам и филиалам.

Стабильный statistics имеет следующие столбцы:

id, revenue, member, referral, date

Вот мой текущий код:

SELECT
   member,
   SUM(revenue) AS payment,
   (SELECT SUM(revenue) FROM statistics WHERE referral = member AND date BETWEEN '04/01/2019' and '04/31/2019') AS aff_earnings,
   (SELECT paypal FROM members WHERE id = member) AS paypal 
FROM
   statistics 
WHERE
   date BETWEEN '04/01/2019' and '04/31/2019' 
GROUP BY
   member

Я получаю правильные результаты для member, payment и paypal.Однако aff_earnings возвращает null для всех результатов.

Для каждого member я хочу получить общую сумму дохода, полученного ими в этом месяце.Это верно, как показано как payment.

Однако я также хочу получить общую сумму, сгенерированную любым из их рефералов.Их рефералов можно найти, выполнив поиск идентификатора этого участника в столбце referral.

Я пытаюсь вывести эту сумму как aff_earnings, но не совсем уверен, почему она возвращается как null: /

1 Ответ

1 голос
/ 11 апреля 2019

Вы можете использовать коррелированные подзапросы, но если они не возвращают строк, то в результате получается NULL.Однако этого не происходит, поскольку подзапрос представляет собой агрегирующий запрос без GROUP BY, поэтому он всегда возвращает одну строку.

Итак, используйте COALESCE():

SELECT s.member, SUM(s.revenue) AS payment,
       (SELECT COALESCE(SUM(s2.revenue), 0)
        FROM statistics s2
        WHERE s2.referral = s.member AND
              s2.date >= '2019-04-01' AND
              s2.date < '2019-05-01'
       ) AS aff_earnings,
       (SELECT m.paypal
        FROM members m
        WHERE m.id = s.member
       ) AS paypal 
FROM statistics s
WHERE s.date >= '2019-04-01' AND
      s.date < '2019-05-01'
GROUP BY s.member;

Примечания:

  • Я добавил псевдонимы таблиц для уникальной идентификации каждой таблицы.
  • Я уточнил все имена столбцов, поэтому их исходная таблица однозначна.
  • Я зафиксировал датуарифметика, как путем введения стандартных форматов даты и упрощения логики для определения диапазона месяцев.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...