Ваш текущий код не работает, поскольку вы не указали, какой счет-фактуру нужно отменить. Вы использовали GROUP BY accountNumber, поэтому он будет возвращать одну строку для каждого значения accountNumber. Другие поля должны быть агрегированными значениями (т. Е. Результатом совокупной функции, такой как MIN() или MAX()). Если поля не упоминаются в предложении GROUP BY или результат агрегатной функции, тогда MySQL вернет значение для этого столбца, но какая строка, из которой происходит это значение, не определена. Это может быть первое или последнее значение строки или любое промежуточное (и может меняться между различными версиями MySQL).
Большинство вариантов SQL не допускают такой запрос и будут ошибки. У MySQL есть функция, которая позволяет это. Но эту функцию можно настроить для отключения.
Чтобы сделать это в стандартном SQL и дать вам согласованное значение, вы используете вспомогательный запрос, чтобы получить первый счет-фактуру для каждого номера учетной записи, используя функцию агрегации MIN(). Затем вы присоединяете этот вспомогательный запрос к таблице счетов-фактур, чтобы получить другие столбцы.
SELECT a.accountNumber,
a.balanceOutstanding,
a.companyName,
b.invoiceDate,
b.netOutstanding
FROM
(
SELECT accountNumber,
MIN(invoiceDate) as invoiceDate
FROM invoices
GROUP BY accountNumber
) sub0
INNER JOIN invoices b ON sub0.account_number = b.account_number AND sub0.invoiceDate = b.invoiceDate
INNER JOIN customersQQuote a ON sub0.account_number = a.account_number
Обратите внимание, что если ACCOUNTNUMBER может иметь 2 одинаковые значения первого InvoiceDate, то вам нужно будет выбрать другое поле, чтобы свести к минимуму (то есть, может быть, ваш уникальный идентификатор поля) для каждой даты. Получает беспорядочный, но что-то вроде этого: -
SELECT a.accountNumber,
a.balanceOutstanding,
a.companyName,
b.invoiceDate,
b.netOutstanding
FROM
(
SELECT accountNumber,
MIN(invoiceDate) as invoiceDate
FROM invoices
GROUP BY accountNumber
) sub0
INNER JOIN
(
SELECT accountNumber,
invoiceDate,
MIN(id) as id
FROM invoices
GROUP BY accountNumber, invoiceDate
) sub1 ON sub0.accountNumber = sub1.accountNumber AND sub0.invoiceDate = sub1.invoiceDate
INNER JOIN invoices b ON sub1.account_number = b.account_number AND sub1.invoiceDate = b.invoiceDate AND sub1.id = b.id
INNER JOIN customersQQuote a ON sub0.account_number = a.account_number
Обратите внимание, что этот SQL-запрос по-прежнему будет возвращать, возможно, неправильную netOutstanding. Если у клиента есть несколько невыполненных счетов-фактур, то вы указали, что хотите получить первую дату счета, но какая netOutstanding возвращается, не указана и может появляться из любой строки.Это основная проблема, с которой столкнулся ваш оригинальный SQL. – Kickstart
Далее, поскольку вы проверяете значение netOutstanding в предложении WHERE, которое исходит из таблицы счетов-фактур, вы фактически сделали INNER JOIN, а не LEFT OUTER JOIN. – Kickstart