Подтвердить что ты не робот

SQL-группировка по месяцам и годам

Я не уверен, что мне следует написать в следующем SQL-запросе, чтобы показать столбец "date" следующим образом: "month-year" - "9-2011".

SELECT MONTH(date) + '.' + YEAR(date) AS Mjesec, SUM(marketingExpense) AS SumaMarketing, SUM(revenue) AS SumaZarada 
FROM [Order]
WHERE (idCustomer = 1) AND (date BETWEEN '2001-11-3' AND '2011-11-3')
GROUP BY MONTH(date), YEAR(date)

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

4b9b3361

Ответ 1

SELECT CAST(MONTH(date) AS VARCHAR(2)) + '-' + CAST(YEAR(date) AS VARCHAR(4)) AS Mjesec, SUM(marketingExpense) AS SumaMarketing, SUM(revenue) AS SumaZarada 
FROM [Order]
WHERE (idCustomer = 1) AND (date BETWEEN '2001-11-3' AND '2011-11-3')
GROUP BY CAST(MONTH(date) AS VARCHAR(2)) + '-' + CAST(YEAR(date) AS VARCHAR(4))

Или как @40-Love упоминается, что вы можете использовать с ведущими нулями:

GROUP BY 
  CAST(YEAR(date) AS VARCHAR(4)) + '-' + right('00' + CAST(MONTH(date) AS VARCHAR(2)), 2) 

Ответ 2

Я думаю, это MS SQL, поскольку он похож на синтаксис MS SQL.

Итак, вы должны поместить в групповую строку то же самое, что и в select ex:

Select MONTH(date)+'-'+YEAR(date), ....
...
...
...
group by MONTH(date)+'-'+YEAR(date)

Ответ 3

Если я правильно понимаю. Чтобы сгруппировать ваши результаты по запросу, предложение Group By должно иметь то же выражение, что и ваш оператор select.

GROUP BY MONTH(date) + '.' + YEAR(date)

Чтобы отобразить дату в формате "месяц-дата", измените значение ".". to '-' Полный синтаксис будет примерно таким.

SELECT MONTH(date) + '-' + YEAR(date) AS Mjesec, SUM(marketingExpense) AS
SumaMarketing, SUM(revenue) AS SumaZarada 
FROM [Order]
WHERE (idCustomer = 1) AND (date BETWEEN '2001-11-3' AND '2011-11-3')
GROUP BY MONTH(date) + '.' + YEAR(date)

Ответ 4

SQL Server 2012 выше, я предпочитаю использовать функцию format(), более упростить.

SELECT format(date,'MM.yyyy') AS Mjesec, SUM(marketingExpense) AS SumaMarketing, SUM(revenue) AS SumaZarada 
FROM [Order]
WHERE (idCustomer = 1) AND (date BETWEEN '2001-11-3' AND '2011-11-3')
GROUP BY format(date,'MM.yyyy')

Ответ 5

В postgresql я могу написать аналогичный запрос с функцией формата даты (to_char) и группировать только по дате:

SELECT to_char (datum, 'MM-YYYY') AS mjesec 
FROM test 
GROUP BY datum 
ORDER BY datum;

Такая вещь, безусловно, возможна и с SQL-Server, не так ли?

Ответ 6

Вы можете попробовать умножение, чтобы скорректировать год и месяц, чтобы они были одним числом. Это, по моим тестам, работает намного быстрее, чем format(date,'yyyy.MM'). Я предпочитаю иметь год до месяца для сортировки. Код, созданный из MS SQL Server Express версии 12.0.

SELECT (YEAR(Date) * 100) + MONTH(Date) AS yyyyMM
FROM [Order]
...
GROUP BY (YEAR(Date) * 100) + MONTH(Date)
ORDER BY yyyyMM

Ответ 7

Если вы хотите остаться с полем в datetime datatype, попробуйте использовать это:

SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, o.[date]), 0) AS Mjesec, SUM(marketingExpense) AS SumaMarketing, SUM(revenue) AS SumaZarada 
FROM [Order] o
WHERE (idCustomer = 1) AND (o.[date] BETWEEN '2001-11-3' AND '2011-11-3')
GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, o.[date]), 0)

Это также легко изменить на группу по часам, дням, неделям, годам... Я надеюсь, что это кому-то полезно,

Привет!