2013-11-28 110 views
0

連接2個表什麼時候能得到每一個可能的和結果我有一個問題:左外連接的SQL Server和複製

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

第二屆重複行查詢工作完美。非常感謝Mathese F – user1984193