2013-11-28 3 views
0

У меня проблема, когда соединение 2 таблицы, чтобы получить возможные результаты сумм каждого из них:левое внешнее соединение сумма сервер SQL дублировать

select cli.codigo, cli.nome, sum(isnull(det1.val_venda,0)) as Vendas_Mes1, 
    sum(isnull(det2.val_venda,0)) as Vendas_Mes2 
    from clientes cli 
    right outer join facmovim fac1 on fac1.clinro=cli.codigo and 
          fac1.ano='2012' and month(fac1.datemi) =12 
    right outer join facmovdet det1 on det1.tipdoc=fac1.tipdoc and 
           det1.serie=fac1.serie and 
           det1.ano=fac1.ano and 
           det1.docnro=fac1.docnro and det1.tiporeg = 'A' 
    right outer join facmovim fac2 on fac2.clinro=cli.codigo and 
          fac2.ano='2013' and month(fac2.datemi) =3 
    right outer join facmovdet det2 on det2.tipdoc=fac2.tipdoc and 
           det2.serie=fac2.serie and 
           det2.ano=fac2.ano and 
           det2.docnro=fac2.docnro and det2.TipoReg = 'A' 

    where cli.codigo = 1 
    group by cli.codigo, cli.nome 

Таблица Det1 имеет 2 записи и таблицы DET2 как 3 записей. Сумма результата каждой таблицы дублируется 5 раз. Можете ли вы помочь мне решить эту проблему? Большое спасибо

+0

Не могли бы вы определить, что вам нужно дублирует Ряды для фильтра –

ответ

0

Вы можете получить дубликаты строк из одной таблицы с помощью этого кода, пожалуйста Попробуйте

with cte as 
    (
    select *,rn=ROW_NUMBER() over (PARTITION by autoid order by id) from tablename 
) 
    select * from cte where rn>1 
0

я не поклонник дубликата суммы без каемки пункта в том же запросе. У меня всегда странный результат.

Вы можете попробовать что-то вроде этого:

select cli.codigo, cli.nome, sum(isnull(det1.val_venda,0)) as Vendas_Mes1, 
sum(isnull(det2.val_venda,0)) as Vendas_Mes2 
from (
select cli.codigo, cli.nome, sum(isnull(det1.val_venda,0)) as Vendas_Mes1, 
0 as Vendas_Mes2 
from clientes cli 
right outer join facmovim fac1 on fac1.clinro=cli.codigo and 
          fac1.ano='2012' and month(fac1.datemi) =12 
right outer join facmovdet det1 on det1.tipdoc=fac1.tipdoc and 
          det1.serie=fac1.serie and 
          det1.ano=fac1.ano and 
          det1.docnro=fac1.docnro and det1.tiporeg = 'A' 
where cli.codigo = 1 
union all 
select cli.codigo, cli.nome, 0 as Vendas_Mes1, 
sum(isnull(det1.val_venda,0)) as Vendas_Mes2 
from clientes cli 
right outer join facmovim fac1 on fac1.clinro=cli.codigo and 
          fac1.ano='2013' and month(fac1.datemi) =12 
right outer join facmovdet det1 on det1.tipdoc=fac1.tipdoc and 
          det1.serie=fac1.serie and 
          det1.ano=fac1.ano and 
          det1.docnro=fac1.docnro and det1.tiporeg = 'A' 
where cli.codigo = 1 
) p 
group by cli.codigo, cli.nome 

Союза как не плохая производительности на всех, и это более точно, особенно если вы не присоединяющиеся тот же таблицу, но другой, чтобы генерировать другую сумму.

В случае, если вы вы могли бы, возможно, чтобы это тоже

select cli.codigo, cli.nome, sum(case when fac1.ano = '2012' then isnull(det1.val_venda,0), else 0 end) as Vendas_Mes1, 
sum(case when fac1.ano = '2013' then isnull(det2.val_venda,0) else 0 end) as Vendas_Mes2 
from clientes cli 
right outer join facmovim fac1 on fac1.clinro=cli.codigo and 
          month(fac1.datemi) =12 
right outer join facmovdet det1 on det1.tipdoc=fac1.tipdoc and 
          det1.serie=fac1.serie and 
          det1.ano=fac1.ano and 
          det1.docnro=fac1.docnro and det1.tiporeg = 'A' 
where cli.codigo = 1 
group by cli.codigo, cli.nome 

Мой код не завершен, но логика внутри :)

+0

2-й запрос работал в совершенстве. Большое спасибо Mathese F – user1984193

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