Можно ли это сделать без подмножества? - PullRequest
3 голосов
/ 09 августа 2011

У меня есть структура таблицы, которая выглядит следующим образом:

Колонки: Номер счета Сервисный код Количество

Учетные записи могут иметь несколько служебных кодов в отдельных строках. Например, для этой учетной записи '1868603' их сервисные коды хранятся так:

ACCOUNT_NUMBER  SERVICE_CODE    SERVICE_QUANTITY
1868603     101     1
1868603     101     1
1868603     101     1
1868603     101     1
1868603     101     1
1868603     101     1
1868603     326     1
1868603     326     1
1868603     327     1
1868603     327     1
1868603     328     1
1868603     328     1

Я пишу запрос, в котором необходимо проверить, есть ли на их счету конкретные коды услуг Я не беспокоюсь о количестве. Я просто хочу посмотреть, существуют ли они для учетной записи.

Это то, что я имею до сих пор:

SELECT ACCOUNT_NUMBER, COUNT(SERVICE_CODE) HOW_MANY
FROM (
    SELECT DISTINCT ACCOUNT_NUMBER, SERVICE_CODE 
    FROM CUSTOMER_SERVICES
    WHERE   ACCOUNT_NUMBER = 1868603 
        AND     SERVICE_CODE IN('323','326','327','328')
)
GROUP BY ACCOUNT_NUMBER

Что дает мне:

ACCOUNT_NUMBER  HOW_MANY
1868603 3

3 - правильное число, потому что есть три экземпляра IN ('323', '326', '327', '328'), что я и пытаюсь определить.

Есть ли способ упростить этот запрос без предварительного подбора данных?

Спасибо!

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Может ли ORACLE сделать COUNT(DISTINCT <field>)?

SELECT
  ACCOUNT_NUMBER, COUNT(DISTINCT SERVICE_CODE) HOW_MANY
FROM
  CUSTOMER_SERVICES
WHERE
  ACCOUNT_NUMBER = 1868603 
  AND SERVICE_CODE IN('323','326','327','328')
GROUP BY
  ACCOUNT_NUMBER


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

Поскольку такие оконные функции (например, DENSE_RANK) также могут иметь различные характеристики производительности, достойныепопытка ...

SELECT
  account_number,
  MAX(rank_id)
FROM
(
  SELECT
    account_number,
    DENSE_RANK() OVER (PARTITION BY account_number ORDER BY service_code) AS rank_id
  FROM
    customer_services
  WHERE
    account_number = 1868603 
    AND service_code IN('323','326','327','328')
)
  AS Data
GROUP BY
  account_number
1 голос
/ 09 августа 2011

Да

SELECT ACCOUNT_NUMBER, COUNT(DISTINCT SERVICE_CODE) HOW_MANY
FROM CUSTOMER_SERVICES
WHERE   ACCOUNT_NUMBER = 1868603 
AND     SERVICE_CODE IN('323','326','327','328')
GROUP BY ACCOUNT_NUMBER
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...