2017-01-26 75 views
2

我遇到了一些麻煩,在不同的表比較的相關數據,我會很感激得到下面的話題有些幫助。不幸的是,我不確定DBS是什麼(儘管沒有什麼優勢),但是在IBM硬件上運行它。因此,爲了簡化數據集:SQL選擇性分組

發票

Doci   Sumi 
1005   10 
1006   15 
1007   7 
1008   20 

付款

Docp  Sump 
1006   -15 
1005   -4 
1005   -6 
1007   -7 

的目的是比較兩個表,並查看是否有匹配 - 本質上,如果發票金額已覆蓋付款與否。對我來說,第一件新事情是比較另一個圖表中負數值的數字數據,但是讓它與-1乘數一起工作。

剩下的問題,我不能真正拿出一個解決方案基本上使查詢瞭解記錄/發票號1005是覆蓋,只有兩個交易。基本上,結果應該只是發票編號1008,因爲它在支付表中沒有匹配。

我確實最終審查了SQL集合函數,即SUM,但是實際上並沒有弄清楚如何利用它,因爲我不想總結整個Sump列中的值,但只有那些具有相同記錄的值在Docp專欄中。

到目前爲止,我已經是這樣的:

SELECT * from INVOICES 
inner join PAYMENTS on INVOICES.Doci = PAYMENTS.Docp 
where Sumi <> (Sump*-1) 

所以,這個查詢的工作來,我不會得到記錄,例如在結果1006和1007的範圍內,但我得到1005,爲看似值10相比4,而不是4 + 6

提前任何反饋

非常感謝!

+1

再來想想,我真的不太清楚您想要的結果 –

回答

2

您可以找到每個DOCP的總池,然後用基於文檔的發票表連接,並總結

select i.* from invoices i 
inner join (
    select 
     docp, 
     sum(sump) sump 
    from payments 
    group by docp 
) p on i.doci = p.docp 
and i.sumi + p.sump <> 0 
0

試試這個,它會給你只奧斯坦丁量。

declare @inv table (Doci int, Sumi decimal) 
insert @inv values (1005, 10), (1006, 15), (1007, 7), (1008, 20) 

declare @pmt table (Docp int, Sump decimal) 
insert @pmt values (1005, -4), (1006, -15), (1007, -7), (1005, -6) 

;with payments(doc, amt) 
as (
    select Docp, sum(Sump) 
    from @pmt 
    group by Docp 
) 
select Doci, Sumi + isnull(amt,0) as Remaining 
from @inv 
left outer join payments p on p.doc = Doci 
where (Sumi + isnull(amt,0)) <> 0 

結果:

Doci  Remaining 
----------- ---------- 
1008  20 
0

我分兩步做的? - 不得不它們組合在一起,以確定是否有多次支付,以及是否平衡的發票或不:

SELECT doci, sumi, docp, sum(sump) as Sump INTO #Step1 
from #INVOICES 
inner join PAYMENTS on INVOICES.Doci = PAYMENTS.Docp 
GROUP BY 
doci, sumi, docp 

GO 

SELECT * from INVOICES 
inner join #PAYMENTS on #INVOICES.Doci = #PAYMENTS.Docp 
where Sumi <> (Sump*-1) AND doci NOT IN (select doci from #step1 WHERE sumi+Sump = 0) 

的結果是一個空的數據集,因爲它只會返回值,其中支付不足以覆蓋發票(!或太多)

所有在你的榜樣的ID必須匹配(即支付==發票)

0

您需要分解問題成爲步驟:

首先總和付款它是ID,Docp。讓我們調用這個查詢的結果PAYMENT_SUM。我們可以調用這個查詢的結果PAYMENT_SUM。

然後將其與發票進行比較。

select 
    I.Doci, 
    I.sumi + P.payment_sum as diff 
from INVOICES I 
left join PAYMENT_SUM P 
on I.Doci = P.Docp 
; 

這會給你一個結果爲:

Doci diff 
1005 0 
1006 0 
1007 0 
1008 null 

現在看看這個結果,你可以多一個子句添加到查詢來選擇你想要的東西。 如果要選擇具有不匹配的所有付款方的發票,然後條款將

where P.Docp is null 

或者,如果你也想擁有它有一個匹配的付款的發票,但量不能完全覆蓋,則:

where (P.Docp is null) or ((I.sumi + P.payment_sum) <> 0) 

現在,所有的步驟組合:

select 
     I.Doci, 
     I.sumi + P.payment_sum as diff 
    from INVOICES as I 
    left join (
     select 
      Docp, 
      SUM(Sump) as payment_sum 
     from PAYMENTS 
     group by Docp 
    ) as P 
    on I.Doci = P.Docp 

    where (P.Docp is null) or (I.sumi + P.payment_sum) <> 0 
    ;