可以只创建一个在同一列上返回两个和的查询吗?
我有什么:
总销售额总和
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
。我怎么能把这个条件?
答案 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
干杯! :)