2015-08-11 3 views
0

Возможно создать только один запрос, который возвращает две суммы в одном столбце?Запрос с двумя суммами в одном столбце

Что у меня есть:

Сумма в общем объеме продаж

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 

первый вопрос. Возможно, у меня в том же запросе есть возвращение одной таблицы с | Месяц | totalSales | SettledSales | ?

второй question.On второй запрос, в котором положение, когда поле serie.documento_tipo_id было 15, в inner join таблицы documento_detail, поле должно быть doc.source_id вместо doc.id. Как я могу поставить это условие?

ответ

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..here мое предложение. Я не уверен, что это даст результат, который вы хотите, а также я боюсь, что производительность может быть плохой. В любом случае, я просто вставьте его здесь. Надеюсь, поможет.)

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 

Cheers! :)

+0

Я проверю ваше предложение и дам уже обратную связь;) заранее заблаговременно –

+0

Ваше предложение почти там: D Это просто не работает для serie.documento_tipo_id = 15, потому что, когда это происходит, внутреннее соединение 'documento_detail' должен быть 'inner join documento_detail как det на DOC.SOURCE_ID = det.documento_id' вместо 'internal join documento_detail как det на DOC.ID = det.documento_id' –

+0

Привет @HugoMachado! вчера не смог вернуться к вам. Я обновил свой ответ. Надеюсь, это поможет ... но я боюсь, что это может привести к плохой работе. – user3462803

Смежные вопросы