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)
Итак, я хочу, чтобы изменить данные из первого столбца, чтобы показать месяц и год, а не показывать только месяц.
Ответы
Ответ 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)
Это также легко изменить на группу по часам, дням, неделям, годам...
Я надеюсь, что это кому-то полезно,
Привет!