Текстовый редактор запросов к построителю отчетов - PullRequest
0 голосов
/ 16 января 2019

Мой работодатель переключил системы данных и инструменты отчетности. Мы привыкли использовать Report Builder с хорошо построенной моделью данных, которая позволяла мне легко выполнять сложную фильтрацию. Затем мы использовали Business Objects, и, хотя мне это не очень нравилось, это также позволило мне выполнить некоторую сложную фильтрацию. Теперь мы вернулись к построителю отчетов, но модель данных отличается, и единственная фильтрация, которую я, похоже, могу сделать, - это строка операторов AND.

(Примечание. Я самоучка как для построителя отчетов, так и для бизнес-объектов. У меня минимальный опыт работы с самим языком кодирования SQL. Кроме того, в этом примере были изменены действительные метки данных.)

Я извлекаю большие объемы данных, поэтому мне нужно выполнить фильтрацию на уровне запроса. Сначала мне нужно включить данные, основанные на пяти критериях, например:

    | SYSTEM.REGION.REGION_STATUS_CODE = N'1'
    | SYSTEM.STATE.STATE_STATUS_CODE = N'1'
AND | SYSTEM.ORDERS.DISCARDED_DATE IS NULL
    | SYSTEM.SERVICE.SERVICE_DISCARDED_DATE IS NULL
    | SYSTEM.SERVICE.SERVICE_STATUS_CODE = N'01'

Затем мне нужно включить данные, которые соответствуют одной из двух пар, как это.

   |     | SYSTEM.SERVICE.SERVICE_CONTRACT_CODE = N'Retail'
   | AND | SYSTEM.ORDERS.DISCOUNT_CODE = N'N/A'
OR | 
   |     | SYSTEM.SERVICE.SERVICE_CONTRACT_CODE = N'Wholesale'
   | AND | SYSTEM.ORDERS.DISCOUNT_CODE != N'N/A'

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

WHERE
  SYSTEM.REGION.REGION_STATUS_CODE = N'1'
  AND SYSTEM.STATE.STATE_STATUS_CODE = N'1'
  AND SYSTEM.ORDERS.DISCARDED_DATE IS NULL
  AND SYSTEM.SERVICE.SERVICE_DISCARDED_DATE IS NULL
  AND SYSTEM.SERVICE.SERVICE_STATUS_CODE = N'01'
  AND SYSTEM.SERVICE.SERVICE_CONTRACT_CODE = N'Retail'
  AND SYSTEM.ORDERS.DISCOUNT_CODE = N'N/A'
  AND SYSTEM.SERVICE.SERVICE_CONTRACT_CODE = N'Wholesale'
  AND SYSTEM.ORDERS.DISCOUNT_CODE != N'N/A'

Я пытался заключить в скобки, но я, должно быть, сделал это неправильно, потому что запрос выполнялся целую вечность, прежде чем я получил всю базу данных.

Кто-нибудь хочет помочь новичку в SQL?

1 Ответ

0 голосов
/ 16 января 2019

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

WHERE
  SYSTEM.REGION.REGION_STATUS_CODE = N'1'
  AND SYSTEM.STATE.STATE_STATUS_CODE = N'1'
  AND SYSTEM.ORDERS.DISCARDED_DATE IS NULL
  AND SYSTEM.SERVICE.SERVICE_DISCARDED_DATE IS NULL
  AND SYSTEM.SERVICE.SERVICE_STATUS_CODE = N'01'
  AND (
        (SYSTEM.ORDERS.DISCOUNT_CODE = N'N/A'
         AND SYSTEM.SERVICE.SERVICE_CONTRACT_CODE = N'Retail')
       OR
        (SYSTEM.ORDERS.DISCOUNT_CODE != N'N/A'
         AND SYSTEM.SERVICE.SERVICE_CONTRACT_CODE = N'Wholesale')
      )

(Это может продолжаться вечно, но это больше зависит от размера базы данных и индексации.)

...