将月份分组为季节
Group months as season
我被困在一个 mysql 查询中。我想知道如何按多行分组。我得到了月份,我想按季节将它们组合在一起,所以例如我想通过添加从 01-03 月份的所有犯罪来显示犯罪计数,并将其显示为冬季等。
这是我目前拥有的代码
SELECT d.month, SUM(c.crimeCount)
FROM FYP_Date d JOIN FYP_Crime c
WHERE d.dateID=c.dateID
GROUP BY month
SELECT d.month, SUM(c.crimeCount), CONVERT(LEFT(d.month, 4), SIGNED) AS y, CONVERT(RIGHT(d.month, 2), SIGNED) AS m, CEIL(CONVERT(RIGHT(d.month, 2), SIGNED)/3) AS q
FROM FYP_Date d JOIN FYP_Crime c WHERE d.dateID=c.dateID GROUP BY q;
对于年份和季度,您必须合并 "y" 和 "q"
SELECT d.month, SUM(c.crimeCount), CONVERT(LEFT(d.month, 4), SIGNED) AS y, CONVERT(RIGHT(d.month, 2), SIGNED) AS m, CEIL(CONVERT(RIGHT(d.month, 2), SIGNED)/3) AS q
FROM FYP_Date d JOIN FYP_Crime c WHERE d.dateID=c.dateID GROUP BY y, q;
原题是如何将月转季,已编辑(见图片)。解决方案是:
SELECT d.month, SUM(c.crimeCount), CEIL(month/3) AS q
FROM FYP_Date d JOIN FYP_Crime c WHERE d.dateID=c.dateID GROUP BY q
将列"month"定义为"year-month"后,解决方法如上(已更新)
这是一个使用 case
语句和 month
的选项:
select case when month(d.month) in (1,2,3) then 'q1',
when month(d.month) in (4,5,6) then 'q2',
when month(d.month) in (7,8,9) then 'q3',
when month(d.month) in (10,11,12) then 'q4'
end as quarter,
SUM(c.crimeCount)
FROM FYP_Date d
JOIN FYP_Crime c ON d.dateID=c.dateID
GROUP BY 1
另请注意——加入时,请使用 on
来匹配您的记录,而不是使用 where
。
可能 QUARTER 函数在这里有帮助:
select quarter(concat(d.month,'-01')) as qrt,
sum(c.crimecount)
from fyp_date d join fyp_crime c on d.dateid=c.dateid
group by qrt;
这与 season 不同,但非常接近。我假设您的 month
列是 char
,所以我附加了一个 '-01'
用于计算,因为 quarter
需要(至少)一天的时间来处理。
我被困在一个 mysql 查询中。我想知道如何按多行分组。我得到了月份,我想按季节将它们组合在一起,所以例如我想通过添加从 01-03 月份的所有犯罪来显示犯罪计数,并将其显示为冬季等。
这是我目前拥有的代码
SELECT d.month, SUM(c.crimeCount)
FROM FYP_Date d JOIN FYP_Crime c
WHERE d.dateID=c.dateID
GROUP BY month
SELECT d.month, SUM(c.crimeCount), CONVERT(LEFT(d.month, 4), SIGNED) AS y, CONVERT(RIGHT(d.month, 2), SIGNED) AS m, CEIL(CONVERT(RIGHT(d.month, 2), SIGNED)/3) AS q
FROM FYP_Date d JOIN FYP_Crime c WHERE d.dateID=c.dateID GROUP BY q;
对于年份和季度,您必须合并 "y" 和 "q"
SELECT d.month, SUM(c.crimeCount), CONVERT(LEFT(d.month, 4), SIGNED) AS y, CONVERT(RIGHT(d.month, 2), SIGNED) AS m, CEIL(CONVERT(RIGHT(d.month, 2), SIGNED)/3) AS q
FROM FYP_Date d JOIN FYP_Crime c WHERE d.dateID=c.dateID GROUP BY y, q;
原题是如何将月转季,已编辑(见图片)。解决方案是:
SELECT d.month, SUM(c.crimeCount), CEIL(month/3) AS q
FROM FYP_Date d JOIN FYP_Crime c WHERE d.dateID=c.dateID GROUP BY q
将列"month"定义为"year-month"后,解决方法如上(已更新)
这是一个使用 case
语句和 month
的选项:
select case when month(d.month) in (1,2,3) then 'q1',
when month(d.month) in (4,5,6) then 'q2',
when month(d.month) in (7,8,9) then 'q3',
when month(d.month) in (10,11,12) then 'q4'
end as quarter,
SUM(c.crimeCount)
FROM FYP_Date d
JOIN FYP_Crime c ON d.dateID=c.dateID
GROUP BY 1
另请注意——加入时,请使用 on
来匹配您的记录,而不是使用 where
。
可能 QUARTER 函数在这里有帮助:
select quarter(concat(d.month,'-01')) as qrt,
sum(c.crimecount)
from fyp_date d join fyp_crime c on d.dateid=c.dateid
group by qrt;
这与 season 不同,但非常接近。我假设您的 month
列是 char
,所以我附加了一个 '-01'
用于计算,因为 quarter
需要(至少)一天的时间来处理。