iT邦幫忙

0

SQL 語法問題...

被這問題困擾許久..
有請各位指點迷津暈

圖片是我舉的例子...

我想要比對A資料表單筆的「統編」、「發票號碼」、「金額」
是否與B資料表單筆的「統編」、「發票號碼」、「金額」
是否一致,若不同 就篩選出來

我目前的盲點在於
A.A NOT IN B.A
AND
A.B NOT IN B.B

A.A+A.B NOT IN B.A+B.B
(把A跟B資料合併成字串做比對)
是否同義?

或是我的需求有更好的寫法呢?
還請各位前輩指點指點謝謝

10
fox18
iT邦研究生 5 級 ‧ 2013-08-27 11:32:49
最佳解答

類似這樣?

<pre class="c" name="code">
select A.*,B.金額 , A.金額 -B.金額 as 差額
from Table_A A
inner join Table_B B on A.統編 = B.統編 and A.發票號碼 = B.發票號碼
where A.金額 -B.金額 <>0

我也是想 Union 後, 做Count, 大於2的排除...
剩下的就是兩個不同資料庫各自獨立的單號~

Ethan Jhuang iT邦研究生 3 級 ‧ 2013-08-27 17:57:58 檢舉

感謝您一目了然的回答!~
但我有一個小問題!~
目前這樣的做法,最後會只有 C.統編,C.發票號碼 及C.金額
如果我要顯示A.單別 A.單號 該如何做呢?

10
fillano
iT邦超人 1 級 ‧ 2013-08-27 12:03:24

簡單的想法,不一定對:

<pre class="c" name="code">
SELECT A.單別, A.單號, B.統編 
FROM A 
LEFT JOIN B 
ON B.統編=A.統編 AND B.發票=A.發票 AND B.金額=A.金額;

統編欄位是NULL的話,就是不一致。

外獅佬 iT邦大師 1 級 ‧ 2013-08-27 12:37:23 檢舉

也有可能是不存在……

fillano iT邦超人 1 級 ‧ 2013-08-27 13:52:06 檢舉

也是。不過不存在也是問題,依照他的需求看起來,B應該要存在的...

8
slime
iT邦大師 1 級 ‧ 2013-08-27 12:50:13

個人覺得還有一個條件要考慮:
究竟發票資料是幾時寫入 A 資料表? 幾時寫入 B 資料表? 才能確保整個大範圍是合理的.

假如 A 資料表是訂單, 發票資料是批次寫入, 而 B 資料表是發票檔, 開票就立刻寫入, 兩者會有一些落差; 要避免發生這種情況.

再來才是確定: 哪一個檔案是主要關鍵? 也就是發票通常是牽涉到請款, 而訂單是輔助.
並且要設定問題點: 發票跳開可能被視為逃漏稅, 所以不能有發票跳開情況, 那就只能有"1. 未開發票 2. 已開發票並相符", 才用這種條件去思考 SQL 寫法.

Ethan Jhuang iT邦研究生 3 級 ‧ 2013-08-27 18:00:03 檢舉

其他相關欄位我都有先篩選過
只是最核心的比對部分有這問題
才上來請大家解惑而已!~

6
純真的人
iT邦高手 1 級 ‧ 2013-08-27 12:59:02

try..

<pre class="c" name="code">
select * from [A資料表] as a
where not exists(
	select * from [B資料表] as b 
	where a.統編 = b.統編 
	and a.發票號碼 = b.發票號碼
	and a.金額 = b.金額
)
4
simon0627
iT邦新手 2 級 ‧ 2013-08-28 09:17:43

這是你要的?

select A.單別,A.單號 from A,B where A.發票號碼=B.發票號碼 and (A.統編!=B.統編 or A.金額!=B.金額)

感覺至少得都有發票號碼才得去進行判斷..而亦是裡面唯一獨立的
統編和金額都有可能重覆....至於發票號碼重覆..好吧我沒思考過...毆飛

我要發表回答

立即登入回答