按月和年分组的SQL分组

weg*_*rer 62 sql sql-server

我不确定我应该在下面的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)
Run Code Online (Sandbox Code Playgroud)

所以,我想要做的是将数据从第一列更改为显示月份和年份,而不是仅显示月份.

Lam*_*mak 146

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))
Run Code Online (Sandbox Code Playgroud)

或者正如@ 40-Love所提到的,你可以使用前导零投射:

GROUP BY 
  CAST(YEAR(date) AS VARCHAR(4)) + '-' + right('00' + CAST(MONTH(date) AS VARCHAR(2)), 2) 
Run Code Online (Sandbox Code Playgroud)

  • 用这种方法按日期排序是没有用的 (2认同)

Dum*_*dan 12

我猜是MS SQL,因为它看起来像MS SQL语法.

所以你应该在组行中输入与select ex相同的东西:

Select MONTH(date)+'-'+YEAR(date), ....
...
...
...
group by MONTH(date)+'-'+YEAR(date)
Run Code Online (Sandbox Code Playgroud)

  • `MONTH(date)` 返回一个 `int`。它将需要一些`cast` -ing。 (2认同)

小智 11

您可以尝试乘法来调整年份和月份,使它们成为一个数字。根据我的测试,这比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
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚读到这篇文章并准备发表同样的评论。效率非常高 (2认同)

YHT*_*TAN 9

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')
Run Code Online (Sandbox Code Playgroud)

  • 我必须使用 `DATE_FORMAT(date, '%m.%Y')` (2认同)

小智 6

如果我理解正确的话.为了按要求对结果进行分组,Group By子句需要与select语句具有相同的表达式.

GROUP BY MONTH(date) + '.' + YEAR(date)
Run Code Online (Sandbox Code Playgroud)

要将日期显示为"月 - 日"格式,请更改"." ' - '完整的语法将是这样的.

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)
Run Code Online (Sandbox Code Playgroud)

  • 猜猜你从来没有尝试过运行这段代码,因为它无法运行? (2认同)

TaK*_*umo 6

对于 mariaDB,您可以:

SELECT DATE_FORMAT(date, '%m-%Y')
FROM [Order]
GROUP BY 
DATE_FORMAT(date, '%m-%Y')
Run Code Online (Sandbox Code Playgroud)

链接: https: //mariadb.com/kb/en/library/date_format/


Mel*_*lOS 5

Yet another alternative: 

Select FORMAT(date,'MM.yy')
...
...
group by FORMAT(date,'MM.yy')
Run Code Online (Sandbox Code Playgroud)