Рассчитывать на DISTINCT нескольких полей работают только на MySQL? - PullRequest
6 голосов
/ 02 сентября 2011

Мне нужен запрос, который без каких-либо изменений работает на этих трех разных серверах баз данных: MySQL, MSSQL, PostgreSQL.В этом запросе мне нужно вычислить столбец со следующим выражением, которое корректно работает на MySQL:

COUNT(DISTINCT field_char,field_int,field_date) AS costumernum

Поля в различном типе имеют различный тип:

field_char = character
field_int  = integer
field_date = datetime

Выражениенаходится внутри родительского запроса select, поэтому, если я пытаюсь достичь результата с помощью подхода подзапроса, я оступаюсь в этой ситуации:

SELECT t0.description,t0.depnum
(select count(*) from (
  select distinct f1, f2, f3 from salestable t1
  where t1.depnum = t0.depnum
) a) AS numitems
FROM salestable t0

Я получаю ошибку с этим запросом, как я могу получить значениеродительского запроса?

Выражение корректно работает на MySQL, но я получаю ошибку, когда пытаюсь выполнить его на Sql Server или PostgreSQL (проблема в том, что функция count не принимает 3 аргумента другого типа на MSSQL / PostgreSQL)Есть ли способ достичь того же результата с помощью выражения, которое работает на каждом из этих серверов баз данных (SQL Server, MySQL, PostgreSQL)?

Ответы [ 2 ]

9 голосов
/ 02 сентября 2011

Общий способ сделать это на любой платформе следующий:

select count(*) from (
  select distinct f1, f2, f3 from table
) a

Редактировать для получения новой информации:

Что если вы попытаетесь присоединиться к отдельному списку (включая отдел), а затем выполнить подсчет? Я создал некоторые тестовые данные, и это, кажется, работает. Убедитесь, что COUNT находится в одном из столбцов t1 - в противном случае он будет ошибочно возвращать 1 вместо 0, если в t1 нет соответствующих записей.

SELECT t0.description, t0.depnum, count(t1.depnum) as 'numitems'
FROM salestable t0
LEFT JOIN (select distinct f1,f2,f3,depnum from salestable) t1
  ON t0.depnum = t1.depnum
GROUP BY
  t0.description, t0.depnum
2 голосов
/ 02 сентября 2011

Как насчет объединения?

COUNT(DISTINCT field_char || '.' || 
               cast(field_int as varchar) || '.' || 
               cast(field_date as varchar)) AS costumernum

Предупреждение: ваш оператор конкатенации может отличаться в зависимости от типа СУБД.

Обновление

По-видимому, переносимость оператора конкатенации сама по себе является вопросом:

Я пытался помочь вам с проблемой distinct.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...