关于mysql:以日历季度为列进行分组

Group by with calendar quarter as column

我希望我的表中一列的总和按日历季度分组。 更具体地说,我现在拥有的是每月我想要的列的总和:

1
2
3
4
5
6
7
8
select month(emitido_date) as mes, year(emitido_date) as ano, ifnull(sum((det.preco * det.quantidade) * (iva.valor/100)),0) as totaliva
from documento as doc
inner join documento_serie as serie on serie.id = doc.documento_serie_id
inner join documento_detail as det on doc.id = det.documento_id
inner join phos_iva as iva on iva.id = det.iva_id
where serie.documento_categoria_id = 2 or  serie.documento_categoria_id = 3
group by mes, ano
order by mes, ano desc

上面的代码很好,适合我。 它按月返回我想要的组的总和。 例如:1月:100,2月:200,3月:300。直到12月。

我的问题是如何按日历季度分组。 具体来说,并寻找上面的例子,现在我想创建一个查询,它给我[1月,2月,3月] = 600,[4月,5月,6月],[7月,8月,9月]的值的总和 ],[十月,十一月,十二月]。 我尝试使用下面的代码但是我收到了一个错误:

1111 - invalid use of group function.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
select
sum(case when month(emitido_date) in (1,2,3) then ifnull(sum(det.quantidade),0) else 0 end) as Tri1,
sum(case when month(emitido_date) in (4,5,6) then ifnull(sum(det.quantidade),0) else 0 end) as Tri2,
    select
    sum(case when month(emitido_date) in (1,2,3) then ifnull(sum((det.preco * det.quantidade) * (iva.valor/100)),0) else 0 end) as Tri1,
    sum(case when month(emitido_date) in (4,5,6) then ifnull(sum((det.preco * det.quantidade) * (iva.valor/100)),0) else 0 end) as Tri2,
    sum(case when month(emitido_date) in (7,8,9) then ifnull(sum((det.preco * det.quantidade) * (iva.valor/100)),0) else 0 end) as Tri3,
    sum(case when month(emitido_date) in (10,11,12) then ifnull(sum((det.preco * det.quantidade) * (iva.valor/100)),0) else 0 end) as Tri4,
    year(emitido_date) as ano
    from documento as doc
    inner join documento_serie as serie on serie.id = doc.documento_serie_id
    inner join documento_detail as det on doc.id = det.documento_id
    inner join phos_iva as iva on iva.id = det.iva_id
    where serie.documento_categoria_id = 3
    group by year(emitido_date)

怎么了?


尝试GROUP BY year(emitido_date)而不是group by ano

同样将ifnull(sum(det.quantidade),0)替换为ifnull(det.quantidade,0),因为CASE子句之外已经有SUM


您无法嵌套聚合函数。 但你不需要。 我想你想要:

1
2
3
4
5
6
7
8
9
select sum(case when month(emitido_date) in (1, 2,3 )
                then det.quantidade else 0 end) as Tri1,
       sum(case when month(emitido_date) in (4, 5, 6)
                then det.quantidade else 0 end) as Tri2,
       sum(case when month(emitido_date) in (7, 8, 9)
                then det.quantidade else 0 end) as Tri3,
       sum(case when month(emitido_date) in (10, 11, 12)
                then det.quantidade else 0 end) as Tri4,
       year(emitido_date) as ano