按日历季度分组列

时间:2015-08-03 14:26:57

标签: mysql sql group-by aggregate-functions mysql-error-1111

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

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 - 无效使用群组功能。

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)

出了什么问题?

2 个答案:

答案 0 :(得分:1)

尝试使用GROUP BY year(emitido_date)代替group by ano

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

答案 1 :(得分:0)

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

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