SQL - Использование логических операторов (где поставить скобки) - PullRequest
0 голосов
/ 11 сентября 2018

Предполагается, что мой запрос подсчитывает количество раз, когда конкретные клиенты были добавлены в таблицу за последний месяц. Если только использовать:

WHERE Return_Table.DateAdded >= DATEADD(month, -1, GETDATE())

Затем я получаю все «CustomerID» и «TimesReturned» в течение этого последнего месяца, и это кажется действительным, но когда я ищу конкретные записи, используя «И» и «ИЛИ» - я получаю результат, показанный ниже, однако это результат больше не учитывает записи за последний месяц.

Фактически, когда я включаю в поиск более или менее конкретных клиентов, значение «TimesReturned» изменяется. Так что, если я ищу «cust1-4», а затем «cust1-2» - TimesReturned считает 1 и 2 изменения.

MyQuery:

SELECT TOP 20 Return_Table.Customer_ID, COUNT(*) AS TimesReturned
FROM Return_Table         
WHERE Return_Table.DateAdded >= DATEADD(month, -1, GETDATE()) AND
 Return_Table.Customer_ID ='cust1' OR
 Return_Table.Customer_ID ='cust2' OR
 Return_Table.Customer_ID ='cust3' OR
 Return_Table.Customer_ID ='cust4'
GROUP BY Return_Table.Customer_ID
ORDER BY TimesReturned DESC

Результат:

Customer_ID TimesReturned
   Cust1         24
   Cust2         14
   Cust3         4
   Cust4         2
   .....        ....

Хотя формат для этого результата правильный, в моем запросе должно быть что-то не так, чтобы значения менялись следующим образом.

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Использование в операторе вместо нескольких ИЛИ:

SELECT TOP 20 Return_Table.Customer_ID,
COUNT(*) AS TimesReturned
 FROM Return_Table         
 WHERE Return_Table.DateAdded >= DATEADD(month, -1, GETDATE()) AND
 Return_Table.Customer_ID in ('cust1' ,'cust2' 'cust3','cust4')
 GROUP BY Return_Table.Customer_ID
 ORDER BY  TimesReturned DESC
0 голосов
/ 11 сентября 2018

Внимательно посмотрите на предложение WHERE:

WHERE Return_Table.DateAdded >= DATEADD(month, -1, GETDATE()) AND
 Return_Table.Customer_ID ='cust1' OR
 Return_Table.Customer_ID ='cust2' OR
 Return_Table.Customer_ID ='cust3' OR
 Return_Table.Customer_ID ='cust4'

Соответствует строкам, где:

  • Дата добавлена ​​в прошлом месяце и идентификатор клиента = 'cust1'
  • Или идентификатор клиента = 'cust2'
  • Или идентификатор клиента = 'cust3'

и так далее. Это объясняет, почему подсчет увеличивается по сравнению с исходным (без фильтра идентификатора клиента). Добавьте скобки, и вы должны быть хороши:

WHERE
 Return_Table.DateAdded >= DATEADD(month, -1, GETDATE()) AND
 (
 Return_Table.Customer_ID ='cust1' OR
 Return_Table.Customer_ID ='cust2' OR
 Return_Table.Customer_ID ='cust3' OR
 Return_Table.Customer_ID ='cust4'
 )

PS: вышеуказанное идентично следующему:

WHERE
 Return_Table.DateAdded >= DATEADD(month, -1, GETDATE()) AND Return_Table.Customer_ID ='cust1' OR
 Return_Table.DateAdded >= DATEADD(month, -1, GETDATE()) AND Return_Table.Customer_ID ='cust2' OR
 Return_Table.DateAdded >= DATEADD(month, -1, GETDATE()) AND Return_Table.Customer_ID ='cust3' OR
 Return_Table.DateAdded >= DATEADD(month, -1, GETDATE()) AND Return_Table.Customer_ID ='cust4'
0 голосов
/ 11 сентября 2018

вам нужно использовать круглые скобки, когда вы будете использовать несколько or с and, лучше использовать круглые скобки, в противном случае в соответствии с приоритетом оператора ваш результат будет манипулировать

 SELECT TOP 20 Return_Table.Customer_ID,
      COUNT(*) AS TimesReturned
     FROM Return_Table         
     WHERE Return_Table.DateAdded >= DATEADD(month, -1, GETDATE()) AND
     (Return_Table.Customer_ID ='cust1' OR
      Return_Table.Customer_ID ='cust2' OR
      Return_Table.Customer_ID ='cust3' OR
      Return_Table.Customer_ID ='cust4'
       )
     GROUP BY Return_Table.Customer_ID

     ORDER BY  TimesReturned DESC
...