У меня возникли проблемы с отображением правильного столбца из моего выбора в выбранном запросе
SELECT
merchant.merchantname 'MerchantName'
, COALESCE(COUNT(transaction.transactionid),0) 'NoofTransaction'
, COALESCE(SUM(transaction.transactionamount),0) 'TotalAmount'
, ( SELECT
statement.statementbalance
FROM statement
WHERE transaction.transactionid = statement.transactionid
ORDER BY
statementbalance DESC LIMIT 1
)
AS 'BalanceRemaining'
FROM merchant
LEFT JOIN transaction ON merchant.merchantid = transaction.merchantid
AND transaction.transactiondate = '2018-01-16'
GROUP BY
merchant.merchantid
ORDER BY
merchant.merchantid ASC;
Это оператор баланса, стоящий в очереди вниз, отсортированный по транзакционному. В моем столбце BalanceRemaining для даты '2018-01-16'
мне должно быть 7. Вместо этого я получал 500 от всех продавцов, перечисленных в том случае, когда запрос sql специально упорядочивается по убыванию и ограничивает строку, возвращаемую в 1. То же самое произойдет, если я изменю его, чтобы получить от transactionid
statementbalance
===
500
.
.
233
90
7
Примеры данных для таблиц: http://sqlfiddle.com/#!9/0ec29f
Вы не заказываете правильный столбец. Если вы хотите получить значение для последней даты, вам необходимо заказать столбцы DATE и TIME в порядке убывания:
SELECT m.merchantname as MerchantName, COALESCE(COUNT(t.transactionid), 0) as NoofTransaction, COALESCE(SUM(t.transactionamount), 0) as TotalAmount, (SELECT s.statementbalance FROM statement s WHERE m.merchantid = s.merchantid AND s.statementdate <= '2018-01-16' ORDER BY s.statementdate DESC, s.statementtime DESC LIMIT 1 ) as BalanceRemaining FROM merchant m LEFT JOIN transaction t ON m.merchantid = t.merchantid AND t.transactiondate = '2018-01-16' GROUP BY m.merchantid ORDER BY m.merchantid ASC;
Чтобы включить это, также измените способ сопоставления данных, а не транзакцией, а вместо торговца.
| MerchantName | NoofTransaction | TotalAmount | BalanceRemaining |
|--------------|-----------------|-------------|------------------|
| Dog1 | 0 | 0 | (null) |
| Cat2 | 13 | 115 | 24.16 |
| Parrot3 | 1 | 20 | 299.25 |
| Beaver4 | 0 | 0 | (null) |
Если вы хотите "7", возможно, вам нужна сортировка ASC
вместо сортировки DESC
.
Я бы также рекомендовал использовать псевдонимы таблицы:
SELECT m.merchantname as MerchantName,
COUNT(t.transactionid), 0) as NoofTransaction,
COALESCE(SUM(t.transactionamount), 0) as TotalAmount,
(SELECT s.statementbalance
FROM statement s
WHERE t.transactionid = s.transactionid
ORDER BY statementbalance ASC
LIMIT 1
) as BalanceRemaining
FROM merchant m LEFT JOIN
transaction t
ON m.merchantid = t.merchantid AND t.transactiondate = '2018-01-16'
GROUP BY m.merchantid
ORDER BY m.merchantid ASC;
Заметки:
as
псевдонимов столбцов.COUNT()
никогда не возвращает NULL
, поэтому COALESCE()
не требуется.
statement.statementdate
или «action.transactiondate ». Еще обратный результат