Sql group by where: SQL GROUP BY Statement

sql — Можем ли мы использовать группу и где условие с тем же именем поля

спросил

Изменено
3 года назад

Просмотрено
142к раз

У меня есть требование, например, вытащить все записи в диапазоне дат, выбранном пользователем, выбрать всех сотрудников, которые начали работу с 15 января 2011 г. по 20 августа 2011 г., и сгруппировать по дате.

Как написать SQL-запрос для этого:

 SELECT *
    ОТ сотрудников
   ГДЕ дата начала >= '15 января 2011'
     И дата начала <= '20 августа 2011'
СГРУППИРОВАТЬ ПО дате начала
 
  • sql
  • sql-сервер
  • tsql
  • sql-сервер-2008

1

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

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

Например, этот запрос даст вам количество сотрудников для каждой даты начала:

 SELECT startdate, count(*)
ОТ сотрудников
ГДЕ дата начала >= '15 января 2011'
      И дата начала <= '20 августа 2011'
СГРУППИРОВАТЬ ПО дате начала
 

Можно, но предложение "GROUP BY" используется для группировки наборов строк, поэтому оно не имеет смысла для вашего вопроса (или чего-либо, что включает "SELECT *").

Чтобы ответить на ваш вопрос:

 SELECT DATEADD(dd, 0, DATEDIFF(dd,0,StartDate)) AS 'StartDate', <другие поля>
ОТ сотрудников
ГДЕ StartDate МЕЖДУ «15 января 2011 г.» И «20 января 2011 г.»
ЗАКАЗАТЬ ПО Дате начала
 

Примечание: зачистка времени от даты пришла отсюда

Зарегистрируйтесь или войдите

Зарегистрироваться через Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Обязательно, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.

Как взаимодействуют предложения наличия, группировки и места

Как взаимодействуют предложения наличия, группировки и места

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

  • Предложение where исключает строки
    которые не соответствуют его условиям поиска.

  • Группа по пункту собирает
    остальные строки в одну группу для каждого уникального значения в группе
    выражением
    .

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

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

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

выберите stor_id, title_id, сумма (кол-во)
от продажидеталь
где title_id как "PS%"
сгруппировать по stor_id, title_id
сумма (кол-во) > 200
 
stor_id title_id
------- -------- -----------
5023     PS1372            375
5023     PS2091          1 845
5023     PS3333          3 437
5023     PS7777          2206
6380     PS7777            500
7067     PS3333            345
7067     PS7777            250
 
(затронуто 7 рядов)
 

Запрос выполнен в следующем порядке:

  1. , где указан только пункт
    строки с title_id , начинающиеся с «PS» (психология
    книги),

  2. группа по собрала строки по
    общий stor_id и title_id ,

  3. Сумма сумма рассчитана
    общее количество проданных книг для каждой группы и

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

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

В следующем примере определяется средняя цена для каждого
тип заголовка, но исключает те типы, у которых не более 10 000 долларов США.
в общем объеме продаж, хотя сумма совокупных
не отображается в результатах.

выберите тип, средняя (цена)
из названий
группировать по типу
имея сумму (total_sales)> 10000
 
тип
------------ ----------
бизнес           13,73
mod_cook           11.49
Popular_comp       21,48
trad_cook          15,96
 
(затронуты 4 ряда)
 

Расширение ведет себя так, как если бы столбец или выражение были
часть списка выбора, но не часть результатов. Если вы включите
неагрегированный столбец с имеет , но это
не является частью списка выбора или 9группа 0073 по пункту ,
запрос выдает результаты, аналогичные «расширенному» столбцу
расширение, описанное ранее в этой главе. Например:

выберите тип, средняя (цена)
из названий
группировать по типу
имея total_sales> 4000
 
тип
------------ ----------
бизнес           13,73
бизнес           13,73
бизнес           13,73
mod_cook           11.49
Popular_comp       21,48
Popular_comp       21,48
психология         13.50
trad_cook          15,96
trad_cook          15.96
 
(затронуты 9 рядов)
 

В отличие от расширенного столбца, столбец total_sales
не отображается в окончательных результатах, однако количество отображаемых
строк для каждого типа зависит от total_sales для
каждое название. Запрос указывает, что три бизнеса, один mod_cook,
два Popular_comp, один по психологии и два trad_cook
общий объем продаж наименований превышает 4000 долларов.