按月份和年份分组

3
我正在尝试按月份和年份分组计算实例数量。
SELECT 
    (MONTH(CAST(t1.some_date as DATE)) + ' ' + YEAR(CAST(t1.some_date as DATE))) as Issue_Month,
    COUNT(*) as c
FROM
    (sub query) t1
GROUP BY 
    (MONTH(CAST(t1.some_date as DATE)) + ' ' + YEAR(CAST(t1.some_date as DATE)))

错误行2:无法对bigint,varchar(1)应用“+”。

我尝试使用&||替换+来构建所需的字符串,但没有成功。


如何生成下面这样的表:

Month Year  |  c

我该如何制作这个表格呢:
Month  |  Year  |  c

1
Presto的连接运算符是||而不是+(我想)。 - forpas
1
我不知道presto是什么,但在T-SQL中,你可以通过month(...)、year(...)进行分组。 - Josh
3个回答

7
您可以使用 date_format() 函数:
SELECT 
    date_format(CAST(t1.some_date as DATE), '%m %Y') as Issue_Month,
    COUNT(*) as c
FROM
    (sub query) t1
GROUP BY 
    date_format(CAST(t1.some_date as DATE), '%m %Y')

1
为什么不使用%Y '%m'这样的格式,而是使用'%m %Y'呢? - forpas
虽然这个方法不是很直观(至少对我来说),但它确实有效。在Excel/VBA中,格式并不重要——无论如何排序都是一样的。显然,我对SQL还很陌生。感谢您回答了两个问题——我知道这是新手的坏习惯:0 - urdearboy
1
date_format() 返回一个字符串,因此排序是按字母数字顺序进行的。Excel 在演示层上进行格式化,保留原始值。 - forpas
那很有道理。我本来期望date_format()返回一个日期。 - urdearboy
如果你想要 MMYYYY 格式,可以尝试这个:GROUP BY date_format(CAST(t1.some_date as DATE), '%m %Y'), date_format(CAST(t1.some_date as DATE), '%Y %m ') ORDER BY date_format(CAST(t1.some_date as DATE), '%Y %m ') 尽管它不是很高效也更加复杂。 - forpas
显示剩余2条评论

0
你可以尝试这样做:
SELECT 
    (MONTH(CAST(t1.some_date as DATE)) + ' ' + YEAR(CAST(t1.some_date as DATE))) as Issue_Month,
    COUNT(*) as c
FROM
    (sub query) t1
GROUP BY 
    (MONTH(CAST(t1.some_date as DATE)), YEAR(CAST(t1.some_date as DATE)))

分组子句不需要 bla + bla。你可以直接按原样包含它们。 顺便说一下,因为你没有使用任何其他表来基于月份,所以你只会得到在其中有 Issue 的月份计数的月份。为了克服这个问题,你可以使用另一个表来保留所有月份和你想要每个月拥有的任何数据(其中包括天数、简称、年度季度、假期等),并将 Issue_Month 左连接到该表,并对主月份表进行 GROUP BY


0

看起来这是获取一个单一字段 月份-年份 的一种方法。当然,这不是实现此目的的最佳方式。

CONCAT(CAST(MONTH(CAST(t1.some_date as DATE)) as Varchar(2))  , '-' , CAST(YEAR(CAST(t1.some_date as DATE)) as  Varchar(4))) as Issue_Month,

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接