Green-sell.info

Новые технологии
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Access count distinct

Особенности функции COUNT

Агрегатные функции.

Итоговые запросы на чтение

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

Для подведения итогов по информации, содержащейся в базе данных, в SQL предусмотрены агрегатные (статистические) функции.

Агрегатами называют группы строк, следовательно, агрегатными функциями называют функции, аргументами которых являются группы строк.

Агрегаты могут представлять собой все строки таблицы или группы строк, созданные предложением GROUP BY (будет рассмотрено в п.13.7.2).

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

В SQL имеется пять стандартных агрегатных функций: SUM, AVG, MIN, MAX, COUNT.

SUM( ) вычисляет сумму всех значений в выражении;

AVG( ) вычисляет среднее всех значений в выражении;

MIN( ) находит наименьшее среди всех значений в выражении;

MAX( ) находит наибольшее среди всех значений в выражении;

COUNT( ) подсчитывает количество значений в выражении.

В качестве выражения чаще всего выступает имя столбца таблицы.

Функция COUNT(*) подсчитывает количество строк (т.е. учитывает и NULL).

Функция COUNT(DISTINCT ) подсчитывает количество разных значений в выражении.

Примечание 1.В Microsoft Access конструкция COUNT(DISTINCT ) не работает. Данная проблема решается применением вложенного запроса в предложении FROM.

Ограничения на использование агрегатных функций:

— агрегатные функции нельзя использовать в предложении WHERE (оно работает для одной строки, а не для агрегата);

— агрегатные функции нельзя вкладывать друг в друга (при необходимости можно использовать вложенные запросы);

— в предложении SELECT нельзя одновременно использоваться агрегатные функции и обычные имена столбцов (если только по этим столбцам не указана группировка GROUP BY)

Примечание 2.В предложении SELECT возвращаемым столбцам, в которых используются агрегатные функции, рекомендуется присваивать псевдонимы.

Пример 29. Вычислить суммарную стоимость всех вызовов.

Пример 30. Вычислить средний возраст для контактов.

Пример 31. Вычислить минимальную и максимальную длительность исходящих вызовов.

SELECT MIN(DLIT), MAX(DLIT)

FROM VYZOVY V, TIPY_VYZ T

WHERE (V.TIP_ID=T.ID) AND (T.NAZV=’Исходящий’)

Пример 32. Вывести дату и время самого первого вызова.

Пример 33. Вычислить количество контактов старше 30 лет.

Пример 34. Вычислить количество мелодий, уже назначенных для какого-либо контакта.

Предикаты ALL, DISTINCT, DISTINCTROW и TOP

Эти предикаты задают записи, выбираемые с помощью запросов SQL.

Синтаксис

SELECT [ALL | DISTINCT | DISTINCTROW | [TOP n [PERCENT]]]
FROM таблица

Инструкция SELECT, содержащая эти предикаты, состоит из следующих частей:

Используется по умолчанию, если вы не указываете ни один из предикатов. Ядро СУБД Microsoft Access выбирает все записи, которые удовлетворяют условиям в инструкции SQL. Следующие два примера эквивалентны и возвращает все записи из таблицы Employees:

Исключает записи, содержащие повторяющиеся данные в выбранных полях. Для включения в результаты запроса значения каждого из полей, перечисленных в инструкции SELECT, должны быть уникальными. Например, у нескольких сотрудников, перечисленных в таблице Employees, могут быть одинаковые фамилии. Если две записи содержат «Глазков» в поле LastName, следующая инструкция SQL возвращает только одну запись, содержащую значение «Глазков»:

Если опустить DISTINCT, этот запрос возвратит обе записи с фамилией «Глазков».

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

Выходные данные запроса, использующего DISTINCT, не является обновляемыми и не отражают изменения, внесенные другими пользователями.

Исключает полностью повторяющиеся записи, а не просто записи с повторяющимися полями. Например, вы можете создать запрос, объединяющий таблицы Customers и Orders по полю CustomerID. В таблице Customers нет повторяющихся полей CustomerID, но в таблице Orders они есть, потому что от каждого клиента может быть несколько заказов. Следующая инструкция SQL показывает, как использовать DISTINCTROW для создания списка компаний, которые имеют по крайней мере один заказ. При этом список не будет включать сведения об этих заказах:

Читать еще:  Sql в access примеры

Если опустить DISTINCTROW, этот запрос создаст несколько строк для каждой компании, от которой поступало более одного заказа.

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

Возвращает записи, относящиеся к верхней или нижней части диапазона, заданного предложением ORDER BY. Предположим, что вы хотите получить имена 25 лучших студентов из группы 1994 г.:

Если не включить предложение ORDER BY, запрос вернет из таблицы Students произвольный набор, включающий 25 записей, которые удовлетворяют предложению WHERE.

Предикат TOP не выбирает между равными значениями. Если в предыдущем примере двадцать пятый и двадцать шестой средний балл совпадают, запрос вернет 26 записей.

Вы также можете использовать зарезервированное слово PERCENT для возвращения определенного процента записей из верхней или нижней части диапазона, заданного предложением ORDER BY. Предположим, что вместо 25 лучших студентов вы хотите получить 10 процентов худших студентов группы:

Предикат ASC позволяет вернуть нижние значения. Значение после TOP должно быть целым числом без знака.

TOP не влияет на возможность обновления запроса.

MySQL Distinct

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

Синтаксис запросов SELECT DISTINCT в MySQL

Базовый синтаксис запросов SELECT DISTINCT :

  • DISTINCT : это ключевое слово возвращает уникальные результаты;
  • Columns : позволяет выбрать столбцы, из которых будет осуществляться выборка. Это может быть один или несколько столбцов;
  • Source : одна или несколько таблиц, присутствующих в базе данных. Используйте ключевое слово JOIN , чтобы соединить несколько таблиц.

Мы собираемся использовать данные, приведенные ниже, чтобы объяснить применение ключевого слова DISTINCT в MySQL на конкретном примере:

DISTINCT-запрос к одному столбцу

В этом примере мы отобразим уникальные записи из столбца education , используя SELECT DISTINCT MySQL . Но сначала выведем все значения из этого столбца:

Теперь я использую ключевое слово DISTINCT :

DISTINCT-запрос к нескольким столбцам

Когда мы используем запрос MySQL DISTINCT по нескольким полям , SELECT вернёт комбинацию нескольких столбцов вместо уникальных отдельных записей. В этом примере мы выберем уникальные записи из столбцов education и profession :

Несмотря на то, что мы использовали ключевое слово DISTINCT в выражении SELECT , из скриншота, приведенного выше видно, что запрос вернул дублирующие результаты внутри каждого столбца, потому что:

  • Bachelors и Developer — это уникальная комбинация;
  • Bachelors и Programming — это уникальная комбинация и т.д.

Пример DISTINCT-запроса в MySQL – условие WHERE

В этом MySQL DISTINCT примере мы покажем, как его использовать вместе с условием WHERE . Следующее выражение возвратит уникальные значения столбцов education и profession из таблицы customers , в которых годовой доход больше или равен 85000 :

Несмотря на то, что существует 13 уникальных записей с комбинациями столбцов education и profession , 10 записей не соответствуют условию WHERE . Поэтому на скриншоте показано только 5 записей.

Замечание : Выражение DISTINCT в MySQL воспринимает NULL как допустимое уникальное значение. Поэтому используйте любое NOT NULL условие или функцию, чтобы избавиться от этих значений.

DISTINCT или GROUP BY в MySQL

В MySQL DISTINCT наследует поведение от GROUP BY . Если вы используете выражение GROUP BY без агрегатной функции, то оно будет выполнять роль ключевого слова DISTINCT .

Единственное отличие между ними заключается в следующем:

  • GROUP BY сначала сортирует данные, а затем осуществляет группировку;
  • Ключевое слово DISTINCT не выполняет сортировки.

Если вы используете ключевое слово DISTINCT вместе с выражением ORDER BY , то получите тот же результат, что и при применении GROUP BY . Следующий запрос возвращает уникальные значения столбца profession из таблицы customerdetails :

Уберём ключевое слово DISTINCT и используем выражение GROUP BY :

Как видите, запрос возвращает тот же результат, но в другом порядке:

Читать еще:  Access control что это

В этом MySQL SELECT DISTINCT примере я использую выражение ORDER BY :

Результат тот же, что и при использовании GROUP BY :

Пример DISTINCT-запроса в MySQL – командная строка

Теперь я покажу, как отобразить уникальные записи с помощью SELECT DISTINCT MySQL в командной строки. В этом случае мы выбираем записи с уникальными значениями столбцов education и profession из таблицы customerdetails :

Данная публикация представляет собой перевод статьи « MySQL Distinct » , подготовленной дружной командой проекта Интернет-технологии.ру

Access 2007: «SELECT COUNT(DISTINCT . «

У меня есть таблица, которая содержит StudyId, а PatientId и StudyStartDateTime. Я хотел бы построить график итогов исследований и пациентов между двумя датами, указанными пользователем. Проблема заключается в подсчете различных значений. Вот такой запрос:

Этот запрос работает почти так же, как и должен, за исключением того, что он подсчитывает дубликаты строк с тем же StudyId или тем же PatientId. Я знаю, что Access не поддерживает COUNT (DISTINCT. ), но у меня есть много проблем, чтобы обойти это. Любая помощь была бы очень признательна.

4 Ответов

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

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

Обратите внимание, что я добавил подсчитанные поля в группу по выражениям в каждом из них.

Если вы хотите сделать его более «compact», вы можете создать представление для каждого из этих запросов и соединить их с отдельным запросом на StudyStartDateTime, чтобы получить все результаты в одном наборе результатов.

Заметил префикс dbo_-это связано с базой данных сервера SQL?

Если это так, вы можете использовать сквозной запрос и использовать счетчик (DISTINCT . ) синтаксис, как он будет передан непосредственно на сервер SQL.

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

Я принял предложение JohnFx и создал эти два подзапроса:

И последний вопрос:

Спасибо за всю помощь, и, надеюсь, кто-то еще найдет это полезным!

Похожие вопросы:

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

Я использую Microsoft Access 2007. У меня есть два оператора SELECT COUNT (*), которые работают нормально без объединения, но я хочу объединить эти операторы, чтобы использовать их в качестве.

Я просто заметил что-то странное на некоторых из моих Informix SQL столбцов (в той же таблице). Когда я делаю этот запрос SELECT DISTINCT colName FROM myTable Я получаю, например, 40 строк. Но когда.

Я использую Visual basic access 2007 для создания Tool.Now моего застревания, поскольку мне нужно применить distinct к типу данных Memo. Но я получаю ошибку поле слишком мало, чтобы принять объем.

COUNT (SELECT DISTINCT LISTAGG(HANDLING_UNIT_ID, ‘,’) WITHIN GROUP(ORDER BY HANDLING_UNIT_ID) FROM SHIPMENT_LINE_HANDL_UNIT WHERE ORDER_NO = SL.ORDER_NO) AS QUANTITY Может кто-нибудь посоветовать.

Q1: почему count (*) настолько медленнее, чем count (distinct col)? Q2: должен ли id всегда использовать count (distinct col)? select count(id) from source; +————+ | count(id) | +————+.

В HIVE я попытался получить количество различных строк в 2 методах, SELECT COUNT (*) FROM (SELECT DISTINCT columns FROM table); SELECT COUNT (DISTINCT columns) FROM table; И то и другое дает разные.

У меня есть база данных продаж, и я хочу иметь возможность увидеть, что было продано в течение определенного периода времени за эти годы, т. е. увидеть, что было продано больше всего за последние 10.

SELECT DISTINCT bw.Bor_name FROM Borrower AS bw, Loan AS l JOIN Book_Copy AS bc ON l.Bc_id = bc.Bc_id WHERE bw.Bor_id = l.Bor_id GROUP BY l.Bor_id, bc.Bt_id HAVING COUNT( bc.Bt_id ) > 1 AND.

Я пытался написать запрос на основе SQL, используя Count distinct, но столкнулся с проблемами в том, как правильно структурировать формат для Microsoft Access. Мой текущий запрос имеет следующий.

Читать еще:  Remote file access

Roger’s Access Blog

Thoughts, opinions, samples, tips, and tricks about Microsoft Access

Monday, April 30, 2012

COUNT DISTINCT in Access: Part 1

From Clause Method

SQL Server has a nice built-in function called COUNT DISTINCT, which is missing in Access SQL.

What does COUNT DISTINCT do? Well, there are times when you want to count distinct values in a query, that is, a count of values without duplicates. For instance, given the following table, how many distinct customers have orders?

ORDERS

In SQL Server, I can do this:

SELECT COUNT(DISTINCT Customer) AS CountOfCustomer FROM Orders
Which will give me the following:

In Access, if I use the Distinct predicate with the count:

SELECT DISTINCT Count(Customer) AS CountOfCustomer FROM Orders;

Since Access SQL does not have the Count Distinct function, what can I do?
There are actually four different methods for simulating the Count Distinct:

  1. Subqueries in the FROM Clause (this post)
  2. Subqueries in the Field List
  3. User-Defined Function
  4. Crosstab Query (reader submitted method)

Each of these methods have advantages and disadvantages, and I’ll address each in turn. This time I’ll start with using a subquery in the FROM clause

Subquery in the FROM Clause Method

Using a subquery in the FROM cause restricts the pool of values for aggregating in the main query. The main advantage is that it’s fairly easy to figure out. The main disadvantage is lack of flexibility.

Note: I have a couple of choices for using a subqueries. They can be used either in-line or stacked. What’s the difference? In the stacked query method, the individual subsqueries are saved as named queries and then referenced by name in later queries. In the in-line method, they are all combined into a single SQL statement.

I find it useful to create use the stacked query method to develop and combine them into a single statement once I’ve got it working correctly. It also gives me a method of checking my results.

Problem 1:

So, back to my original problem. First, I create a simple aggregate query, grouping the customers:

SELECT Customer FROM Orders GROUP BY Customer;

SimpleStep1 (saved query)

I’ll save that as SimpleStep1. Then I’ll use SimpleStep1 in the FROM clause for a second query:

SELECT Count(Customer) AS CountOfCustomer FROM SimpleStep1;

SimpleStep2

Combining these into a single query:

SELECT Count(Step1.Customer) AS CountOfCustomer
FROM (SELECT Customer FROM Orders GROUP BY Customer) AS Step1;

SimpleCombined

Note: the alias «Step1» could be anything at all, even «A». I used «Step1» to illustrate how the queries are related.

More Complex Queries: Problem 2

This is all well and good, but, unfortunately, this is only useful in limited situations. If I wanted a more complex query, say, how many customers per day:

it is much more difficult.

SQL Server

With COUNT DISTINCT, in SQL Server, I can just add an additional field to the Field List and Group By clauses.

SELECT OrderDate, COUNT(DISTINCT Customer) AS CountOfCustomer FROM Orders
GROUP BY OrderDate;

Access

If I try to do the same thing in Access,
SELECT OrderDate, Count(Step1.Customer) AS CountOfCustomer
FROM (SELECT Customer FROM Orders GROUP BY Customer) AS Step1
GROUP BY OrderDate;

I get a parameter box asking for OrderDate:

In retrospect the reason for this if fairly obvious. I’m using a GROUP BY in the subquery in the FROM clause to limit the values available and OrderDate isn’t in the field list.

So to fix it, I have to add OrderDate to both the subquery and the main query:

SELECT Step1.OrderDate, Count(Step1.Customer) AS CountOfCustomer
FROM (SELECT OrderDate, Customer
FROM Orders GROUP BY OrderDate, Customer) AS Step1
GROUP BY Step1.OrderDate;

Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector
×
×