Как подсчитать записи по неделям из определенного фрейма данных с помощью SQL-запроса

#sql #sql-server

#sql #sql-сервер

Вопрос:

Дата начала: 14.10.2016 Дата окончания: Statdate — 4 недели

Мне нужен один запрос, который выполняет эту последовательность в SQL

 SELECT COUNT(*) FROM TableName
    WHERE AddDate between  '10/14/2016 10:16:00' and '10/14/2016 10:31:00'

SELECT COUNT(*) FROM TableName
    WHERE AddDate between  '10/07/2016 10:16:00' and '10/07/2016 10:31:00'

SELECT COUNT(*) FROM TableName
    WHERE AddDate between  '09/30/2016 10:16:00' and '09/30/2016 10:31:00'

SELECT COUNT(*) FROM TableName
    WHERE AddDate between  '09/23/2016 10:16:00' and '09/23/2016 10:31:00'  
 

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

Ответ №1:

Как насчет чего-то подобного (для MySQL, но подобное существует для других баз данных)

 SELECT 
DATE(AddDate) as TheDate,
COUNT(*) as Records
FROM TableName
WHERE
AddDate BETWEEN '2016-23-09' AND '2016-10-15'
AND DAYOFWEEK(AddDate) = 1 //for SUNDAYS
AND TIME(AddDate) BETWEEN '10:16:00' AND '10:31:00'
GROUP BY DATE(AddDate)
ORDER BY DATE(AddDate) ASC
 

Я не тестировал это, но это должно дать вам что-то вроде:

 TheDates    Records
--------------------
2016-09-23    120
2016-09-30    157
...etc
 

Комментарии:

1. Вам нужно будет использовать DATEPART , если вы используете SQL Server, вместо функций даты и времени, которые я использовал в своем примере.

2. SQL Server 2008 и выше:

3. Я изменил инструкцию для поддержки SQL Server

4. ВЫБЕРИТЕ CONVERT(Date, AddDate) в качестве даты, COUNT(*) как записи ИЗ TableName С (NOLOCK), ГДЕ CONVERT(Date, AddDate) МЕЖДУ ‘23.09.2016’ И ‘23.10.2016’ И DATEPART(dw, AddDate)= 6 И CONVERT(Time, AddDate) МЕЖДУ ’10:16:00′ И ’10:31:00′ ГРУППИРОВАТЬ ПО ПРЕОБРАЗОВАНИЮ (дата, дата добавления) УПОРЯДОЧИВАТЬ ПО ПРЕОБРАЗОВАНИЮ (дата, дата добавления) ASC

Ответ №2:

Разве вы не можете просто использовать UNION, чтобы собрать их все вместе? Или вы просите что-то еще?

 SELECT COUNT(*) FROM TableName
    WHERE AddDate between  '10/14/2016 10:16:00' and '10/14/2016 10:31:00'
UNION
SELECT COUNT(*) FROM TableName
    WHERE AddDate between  '10/07/2016 10:16:00' and '10/07/2016 10:31:00'
UNION
SELECT COUNT(*) FROM TableName
    WHERE AddDate between  '09/30/2016 10:16:00' and '09/30/2016 10:31:00'
UNION
SELECT COUNT(*) FROM TableName
    WHERE AddDate between  '09/23/2016 10:16:00' and '09/23/2016 10:31:00'  
 

Ответ №3:

Используйте Group by

 SELECT 
LEFT(DATENAME(wk,AddDate),2) as WeekNumber , 
COUNT(*) as Count 
FROM TableName
WHERE AddDate between  '09/23/2016 10:16:00' and '10/14/2016 10:31:00'
GROUP BY LEFT(DATENAME(wk,AddDate),2) 
 

Комментарии:

1. Это возвращает данные за всю неделю.

2. Да, это дает количество каждой недели, в какую сторону вы хотите выводить

Ответ №4:

Вот один из способов использования CASE инструкции

 SELECT ranges,count(*)
FROM   (SELECT CASE
                 WHEN AddDate BETWEEN '10/14/2016 10:16:00' AND '10/14/2016 10:31:00' THEN '10/14/2016 10:16:00 - 10/14/2016 10:31:00'
                 WHEN AddDate BETWEEN '10/07/2016 10:16:00' AND '10/07/2016 10:31:00' THEN '10/07/2016 10:16:00 - 10/07/2016 10:31:00'
                 WHEN AddDate BETWEEN '09/30/2016 10:16:00' AND '09/30/2016 10:31:00' THEN '09/30/2016 10:16:00 - 09/30/2016 10:31:00'
                 WHEN AddDate BETWEEN '09/23/2016 10:16:00' AND '09/23/2016 10:31:00' THEN '09/23/2016 10:16:00 - 09/23/2016 10:31:00'
               END AS ranges
        FROM   yourtable) a
GROUP  BY ranges