Вы могли бы сделать:
def func(n=5.0, delta=None):
if delta is None:
delta = n / 10
...
Условие «t.status = 0
» в предложении WHERE
отрицает «внешность» соединения; тот же результат, который мы получили бы с ВНУТРЕННИМ СОЕДИНЕНИЕМ.
При внешнем соединении любые строки в locations
, которые не имеют совпадающей строки в turns
, будут возвращены со значениями NULL для всех столбцов t.
. Несоответствующие строки из locations
будут исключены условием в предложении WHERE.
Рассмотрите возможность перемещения этого условия из условия WHERE
в предложение ON
внешнего соединения.
Или рассмотрите возможность перемещения этого условия в совокупное выражение.
В качестве примера:
SELECT l.id
, l.zipcode
, SUM(IF(t.status = 0, 1, 0)) AS turns
, SUM(IF(t.status = 0 AND t.itemspurchased > 0, t.itemspurchased, 0)) AS items
FROM locations l
LEFT
JOIN turns t
ON t.locationid = l.id
AND t.status = 0
WHERE l.zipcode = XXXX
GROUP
BY l.id
, l.zipcode
Использование левого соединения и расстановка критериев в разных местах.
Чтобы избежать этого, используя критерии в предложении WHERE для таблицы LEFT JOIN'd, это дало бы эффект, как если бы оно было INNER JOIN.
SELECT
loc.ZIPCode,
COUNT(DISTINCT CASE turns.status WHEN 0 THEN turns.id END) AS turns,
SUM(CASE
WHEN turns.status = 1 AND turns.itemsPurchased > 0
THEN turns.itemsPurchased
ELSE 0
END) AS items
FROM locations loc
LEFT JOIN turns ON turns.locationId = loc.id
WHERE loc.ZIPCode = 12345
GROUP BY loc.id, loc.ZIPCode