【问题标题】:Query with two sums on the same column在同一列上使用两个总和进行查询
【发布时间】:2015-08-12 09:43:43
【问题描述】:

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

我有什么:

总销售额

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| 的表。总销售额 |已结算销售| ?

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

【问题讨论】:

    标签: mysql sql mysql-workbench


    【解决方案1】:

    用例语句。试试这个。

        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
    

    干杯! :)

    【讨论】:

    • 我会测试你的建议并给出反馈;)提前谢谢
    • 您的建议几乎就在那里 :D 它只是不适用于 serie.documento_tipo_id = 15,因为当它发生时,'documento_detail' 的内部连接必须是 'inner join documento_detail 作为 DOC 上的 det。 SOURCE_ID = det.documento_id' 而不是 'inner join documento_detail as det on DOC.ID= det.documento_id'
    • 嗨@HugoMachado!昨晚没能回复你。我更新了我的答案。希望它有所帮助..但我担心这可能会导致性能不佳。
    • 您的回答几乎是完美的。我只需要将“case when...sum(...)”更改为“sum(case when ...”。现在,它是完美的。关于你提到的性能,我不知道,但对我来说,太完美了。我真的很感激。非常感谢。
    • 不客气@HugoMachado。很高兴知道。 :) 很高兴我能帮上忙。谢谢:D
    猜你喜欢
    • 1970-01-01
    • 2012-05-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2021-01-14
    • 2022-01-15
    • 2017-07-14
    相关资源
    最近更新 更多