在同一列上查询两个总和

时间:2015-08-11 08:47:43

标签: mysql sql mysql-workbench

可以只创建一个在同一列上返回两个和的查询吗?

我有什么:

总销售额总和

select month(emitido_date) as mes, ifnull(sum((det.preco * det.quantidade) * (iva.valor/100) + (det.preco * det.quantidade) - (det.preco * det.quantidade * (det.desconto/100))),0) as total
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  and doc.rascunho = false and doc.exercicio_id = 4 
group by mes
order by mes

结算销售总额

select month(emitido_date) as mes, ifnull(sum((det.preco * det.quantidade) * (iva.valor/100) + (det.preco * det.quantidade) - (det.preco * det.quantidade * (det.desconto/100))),0) as total
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  and doc.rascunho = false and doc.exercicio_id = 4 and (serie.documento_tipo_id = 10 or serie.documento_tipo_id = 11 or serie.documento_tipo_id = 15)
group by mes
order by mes

第一个问题。我可能在同一个查询中返回一个带有| Month |的表totalSales | SettledSales | ?

第二个问题。在第二个查询中,在where子句中,当字段serie.documento_tipo_id为15时,在表inner join的{​​{1}}中,字段应为documento_detail而不是doc.source_id。我怎么能把这个条件?

1 个答案:

答案 0 :(得分:2)

使用案例陈述。试一试。

    select month(emitido_date) as mes, 
    case when (serie.documento_tipo_id = 10 or serie.documento_tipo_id = 11 or serie.documento_tipo_id = 15)
    then ifnull(sum((det.preco * det.quantidade) * (iva.valor/100) + (det.preco * det.quantidade) - (det.preco * det.quantidade * (det.desconto/100))),0)
    end settledSales,
    ifnull(sum((det.preco * det.quantidade) * (iva.valor/100) + (det.preco * det.quantidade) - (det.preco * det.quantidade * (det.desconto/100))),0) as totalSales
    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  and doc.rascunho = false and doc.exercicio_id = 4 
    group by mes
    order by mes

因为你提到内部联接是不同的,当serie.documento_tipo_id = 15时,我的建议是什么。我不确定这是否会给你想要的结果,而且我担心它的性能可能会很差。但是,我只是将它粘贴在这里。希望能帮助到你。 :)

select mes, sum(settledSales), sum(totalSales)
from 
   (select month(emitido_date) as mes, 
    case when (serie.documento_tipo_id = 10 or serie.documento_tipo_id = 11)
    then ifnull(sum((det.preco * det.quantidade) * (iva.valor/100) + (det.preco * det.quantidade) - (det.preco * det.quantidade * (det.desconto/100))),0)
    end settledSales,
    ifnull(sum((det.preco * det.quantidade) * (iva.valor/100) + (det.preco * det.quantidade) - (det.preco * det.quantidade * (det.desconto/100))),0) as totalSales
    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  and doc.rascunho = false and doc.exercicio_id = 4 
    and serie.documento_tipo_id <> 15
    group by mes    
    UNION    
    select month(emitido_date) as mes,    
    ifnull(sum((det.preco * det.quantidade) * (iva.valor/100) + (det.preco * det.quantidade) - (det.preco * det.quantidade * (det.desconto/100))),0)
    settledSales,
    0 as totalSales
    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.SOURCE_ID = det.documento_id
    inner join phos_iva as iva on iva.id = det.iva_id
    where serie.documento_categoria_id = 3  and doc.rascunho = false and doc.exercicio_id = 4 
    and serie.documento_tipo_id = 15
    group by mes
    order by mes
    ) detail
group by mes

干杯! :)