Как использовать GROUP с DATEPART?

#sql #sql-server

#sql #sql-сервер

Вопрос:

Я использую следующий скрипт для подсчета количества shopId за один год.

Мне также нужно разбить результат по месяцам за год.

Таким образом, конечный результат должен быть

 MONTH 1
    SHOPID 5     100
    SHOPID 4     90
MONTH 2
    SHOPID 1     150
    SHOPID 4     80
 

    SELECT ShopId, Count(ShopId) as Interest
    FROM dbo.Analytics
    WHERE DateCreated >= '2014' AND DateCreated < '2015'
    GROUP BY ShopId ORDER BY Interest DESC
 

Структура таблицы

 CREATE TABLE Analytics
(
DateCreated dateTime2(2),
ShopId  int
);
 

Что я должен изменить в своем скрипте? Должен ли я использовать DATEPART рядом с GROUP BY

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

1. Любые предложения по лучшему названию приветствуются 🙂

2. DateCreated — это поле DateTime?

3. Пожалуйста, также опубликуйте свою структуру таблицы

4. Добавлена структура таблицы @Raj

Ответ №1:

Вы можете использовать DatePart.

Попробуйте так

     SELECT DatePart(mm,datecreated) 'Month',ShopId, Count(ShopId) as Interest
    FROM dbo.Analytics
    WHERE year(DateCreated) = '2015' 
    GROUP BY Datepart(mm,datecreated),ShopId 
    ORDER BY Interest DESC
 

DatePart вернет только номер месяца. Если вам нужно, чтобы результат имел название месяца, тогда вам следует использовать DateName

Попробуйте это

     SELECT Select DateName( month , DateAdd( month , DatePart(mm,datecreated) , -1 ) ) 'Month',ShopId, Count(ShopId) as Interest
    FROM dbo.Analytics
    WHERE year(DateCreated) = '2015' 
    GROUP BY DateName( month , DateAdd( month , DatePart(mm,datecreated) , -1 ) ),ShopId 
    ORDER BY Interest DESC
 

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

1. Как бы вы упорядочили по месяцам?

2. @GibboK Просто используйте Order By DatePart(mm,datecreated)

Ответ №2:

Попробуйте это

     SELECT datepart(mm,datecreated) 'Month',ShopId, Count(ShopId) as Interest
    FROM dbo.Analytics
    WHERE year(DateCreated) = '2014' 
    GROUP BY datepart(mm,datecreated),ShopId ORDER BY Interest DESC
 

Ответ №3:

Здесь вам также нужно сгруппировать год, если существует более широкий временной диапазон :

 select convert(varchar(6), DateCreated, 112) as Time, shopid, Count(ShopId) as Interest
    FROM Analytics
    WHERE DateCreated >= '2014' AND DateCreated < '2015'
    GROUP BY convert(varchar(6), DateCreated, 112), ShopId ORDER BY Interest DESC
 

Ответ №4:

Попробуйте это:

 SELECT      DATEPART(MONTH, DateCreated) AS MONTH, ShopId, COUNT(ShopId) AS Interest
FROM        dbo.Analytics
WHERE       YEAR(DateCreated) = '2014'
GROUP BY    DATEPART(MONTH, DateCreated), ShopId
ORDER BY    DATEPART(MONTH, DateCreated) ASC, Interest DESC