Выберите запрос в запросе, который приводит к противоположному результату

0

У меня возникли проблемы с отображением правильного столбца из моего выбора в выбранном запросе

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

Теги:

2 ответа

1
Лучший ответ

Вы не заказываете правильный столбец. Если вы хотите получить значение для последней даты, вам необходимо заказать столбцы 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) |

см.: http://sqlfiddle.com/#!9/cc2440/3

  • 0
    Столбец даты, который у меня есть, является статическим, например, «2018-01-16» в течение дня со временем, разделенным в другом столбце. единственный вероятный способ сортировки по убыванию - это транзакция и указатель состояния. В этом случае наибольший / самый поздний идентификатор транзакции этой конкретной даты соответствует столбцу «Остаток остатка». Но я пытался, и это все равно дает мне результат в обратном порядке, независимо от ЗАКАЗА. Я также попробовал ваш способ размещения столбца DATE, который в данном случае является statement.statementdate или «action.transactiondate ». Еще обратный результат
  • 0
    без выборочных данных чрезвычайно трудно быть полезным, поскольку каждый «ответ» или «комментарий» основан на каком-то предположении. Возможно, объединение в этой корреляции должно быть на уровне продавца, а не на уровне транзакции? тогда будет работать сортировка по столбцу даты и времени (или объединение этих столбцов). Рассмотрите возможность предоставления образцов данных или настройки sqlfiddle
Показать ещё 10 комментариев
0

Если вы хотите "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() не требуется.
  • 0
    то же самое. Дело в том, что возвращаемые данные всегда в обратном порядке, независимо от порядка, внутри запроса выбора внутри запроса выбора

Ещё вопросы

Сообщество Overcoder
Наверх
Меню