Запросить возврат данных за пределы условия WHERE - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь получить сводные данные из таблицы в зависимости от DateTime и состояния. Проблема в том, что мне нужно несколько значений состояния, например 'где 1 или 2 или 3'

SELECT SUM(ticketTotalAmount)
FROM tickets 
WHERE ticketDate >= '2019/04/01 00:00:00' AND ticketDate <= '2019/04/02 23:59:59'
  AND ticketState = 'STAND BY'
   OR ticketState = 'WIN'
   OR ticketState = 'LOSE'

Выходные данные должны извлекать обобщенные данные на основе любого из этих трех состояний: Win, Lose или Standby и в диапазоне ticketDate, но фактический выходной сигнал выходит за рамки ограничений DateTime.

Удаление условий состояния и оставление только DateTime извлекает данные в рамках условия. Проблема в том, что существует больше, чем эти 3 состояния.

Ответы [ 5 ]

3 голосов
/ 02 апреля 2019

Проблема заключается в порядке пунктов AND и OR.

Попробуйте:

SELECT SUM(ticketTotalAmount)
FROM   tickets 
WHERE  ticketDate >= '2019/04/01 00:00:00' AND ticketDate <= '2019/04/02 23:59:59' AND
       (ticketState = 'STAND BY' OR ticketState = 'WIN' OR ticketState = 'LOSE');

Или даже лучше:

SELECT SUM(ticketTotalAmount)
FROM   tickets 
WHERE  ticketDate BETWEEN '2019/04/01 00:00:00' AND '2019/04/02 23:59:59'
  AND  ticketState IN ('STAND BY', 'WIN', 'LOSE');
1 голос
/ 02 апреля 2019

Использование IN([...]) проще для чтения, но полезно видеть и понимать использование скобок для группировки критериев, чтобы вы могли получить нужные результаты. Пример:

SELECT SUM(ticketTotalAmount)
FROM tickets 
WHERE
        ticketDate >= '2019/04/01 00:00:00'
    AND ticketDate <= '2019/04/02 23:59:59'
    AND 
    (
           ticketState = 'STAND BY'
        OR ticketState = 'WIN'
        OR ticketState = 'LOSE'
    )
1 голос
/ 02 апреля 2019

Я бы порекомендовал написать запрос так:

SELECT SUM(t.ticketTotalAmount)
FROM tickets t
WHERE t.ticketDate >= '2019-04-01' AND
      t.ticketDate < '2019-04-03' AND
      t.ticketState IN ('STAND BY', 'WIN', 'LOSE');

Обратите внимание на изменения в запросе:

  • Вместо OR используйте IN. Это понятнее. Это исправит вашу явную проблему.
  • Логика даты упрощена, поэтому вам не нужно иметь дело со значениями времени (или со значениями, которые происходят в течение последних нескольких миллисекунд дня).
  • Псевдонимы таблиц - хорошая идея; Обычно я считаю их необязательными при запросах только с одной таблицей.
1 голос
/ 02 апреля 2019

использование IN

SELECT SUM(ticketTotalAmount) FROM tickets 
WHERE ticketDate >= '2019/04/01 00:00:00' AND ticketDate <= '2019/04/02 23:59:59' 
AND ticketState in( 'STAND BY' , 'WIN' ,'LOSE')
1 голос
/ 02 апреля 2019

Заключите условия заявки в круглые скобки

SELECT SUM(ticketTotalAmount) FROM tickets 
WHERE ticketDate >= '2019/04/01 00:00:00' AND ticketDate <= '2019/04/02 23:59:59' AND ( ticketState = 'STAND BY' OR ticketState = 'WIN' OR ticketState = 'LOSE')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...