2013-10-09 74 views
2

你好我需要一點幫助,編寫一個基於my_id,report_id基本上指出沒有相應的否定匹配數的行的sql語句。oracle sql如何獲得不匹配的積極記錄

下面是表格聲明,以便更好地解釋。

CREATE TABLE ."TEST" 
    ("REPORT_ID" VARCHAR2(100 BYTE), 
"AMOUNT" NUMBER(17,2), 
"MY_ID" VARCHAR2(30 BYTE), 
"FUND" VARCHAR2(20 BYTE), 
"ORG" VARCHAR2(20 BYTE) 
    ) 

這裏是一些樣本數據

Insert into TEST (REPORT_ID,AMOUNT,MY_ID,FUND,ORG) values ('1',50,'910','100000','67120'); 

Insert into TEST (REPORT_ID,AMOUNT,MY_ID,FUND,ORG) values ('1',-50,'910','100000','67130'); 

Insert into TEST (REPORT_ID,AMOUNT,MY_ID,FUND,ORG) values ('1',100,'910','100000','67150'); 

Insert into TEST (REPORT_ID,AMOUNT,MY_ID,FUND,ORG) values ('2',200,'910','100000','67130'); 

Insert into TEST (REPORT_ID,AMOUNT,MY_ID,FUND,ORG) values ('2',-200,'910','100000','67120'); 
INSERT INTO TEST (REPORT_ID, AMOUNT, MY_ID, FUND, ORG) VALUES ('1', '40.17', '910', '100000', '67150') 
INSERT INTO TEST (REPORT_ID, AMOUNT, MY_ID, FUND, ORG) VALUES ('1', '-40.17', '910', '100000', '67150') 
INSERT INTO TEST (REPORT_ID, AMOUNT, MY_ID, FUND, ORG) VALUES ('1', '40.17', '910', '100000', '67150') 
如果你創建表並仔細觀察

,你會發現,通過REPORT_ID和添加my_id最積極的數量有直接的負面量。另一方面,我需要通過my_id和report_id來確定那些沒有相應負值的正數。

預期的結果應該是這樣的

"REPORT_ID"     "FUND"      "MY_ID"      "ORG"       "AMOUNT"      
"1"       "100000"      "910"       "67150"      "40.17"      
"1"       "100000"      "910"       "67150"      "100"       

任何想法如何能acomplish這一點。

編輯: 發佈了錯誤的輸出結果。只是爲了清楚基金和組織直到比賽結束後纔有意義。例如,如果我正在使用plsql寫這個,我會發現有多少缺點,然後我有多少個額外的比較每個加上金額的每個減去金額和刪除它們,然後我會留下任何加上沒有負金額。 我對此感到抱歉。希望這現在更清楚。一旦我擁有了所有的比賽,我應該只剩下積極的數額。

編輯:

additional inserts 

Insert into TEST (REPORT_ID,AMOUNT,MY_ID,FUND,ORG) values ('5',71,'911','100000','67150'); 
Insert into TEST (REPORT_ID,AMOUNT,MY_ID,FUND,ORG) values ('5',71,'911','100000','67120'); 
Insert into TEST (REPORT_ID,AMOUNT,MY_ID,FUND,ORG) values ('5',71,'911','100000','67140'); 
Insert into TEST (REPORT_ID,AMOUNT,MY_ID,FUND,ORG) values ('5',71,'911','100000','67130'); 
Insert into TEST (REPORT_ID,AMOUNT,MY_ID,FUND,ORG) values ('5',71,'911','100000','67130'); 
Insert into TEST (REPORT_ID,AMOUNT,MY_ID,FUND,ORG) values ('5',71,'911','100000','67130'); 
Insert into TEST (REPORT_ID,AMOUNT,MY_ID,FUND,ORG) values ('5',-71,'911','100000','67150'); 
Insert into TEST (REPORT_ID,AMOUNT,MY_ID,FUND,ORG) values ('5',-71,'911','100000','67150'); 
Insert into TEST (REPORT_ID,AMOUNT,MY_ID,FUND,ORG) values ('5',-71,'911','100000','67150'); 
+1

非常令人耳目一新,所有的數據都可以在問題中使用!請你只是澄清爲什麼200會顯示在上面的輸出中,因爲有相應的-200行? – ChrisProsser

+2

org呢?應該忽略? – mucio

+0

回答以上2條評論,那麼人們可以給你一些問題。 – johnny

回答

1

新版本

這應該只返回所需的行。如果你不與組織或基金有關,那麼你就只能使用的別名X查詢:

select distinct t1.report_id, t1.fund, t1.my_id, t1.org, t1.amount 
    from test t1, 
     (select distinct t.report_id, t.my_id, abs(amount) as amount 
     from test t 
     group by t.report_id, t.my_id, abs(amount) 
     having sum(t.amount) > 0) x 
where t1.report_id = x.report_id 
    and t1.my_id = x.my_id 
    and t1.amount = x.amount; 

以前的版本

select * 
    from test t 
minus 
select t1.* 
    from test t1, 
     test t2 
where t1.amount = -1*t2.amount 
    and t1.report_id = t2.report_id 
    and t1.my_id = t2.my_id; 

這只是給出了輸出的行中的一行我已經要求你在評論中澄清爲什麼應該包含任何200行(如果應該的話)。我也不確定是否需要包含47.17的值中的一個。這樣做的困難在於您提供的示例數據中的兩個正值是相同的,這是正確的嗎?

+0

我澄清以上感謝和抱歉的混淆。 – Miguel

+0

這是正確的,我應該以40.17結束,因爲有兩個pos和一個neg。然後兩個相互抵消,因此單一的積極應該出來。 – Miguel

+0

我剛剛更新了編輯,你一直對我道歉,我是一個白癡。 – Miguel

1

這是一個修改後的版本查詢,適用於我的情況。我用SQL SERVERZ

select * 
    from test t 
EXCEPT 
select t1.* 
    from test t1, 
     test t2 
where t1.amount = -1*t2.amount 
    and t1.report_id = t2.report_id 
    and t1.my_id = t2.my_id; 

結果與您的數據 REPORT_ID金額添加my_id基金ORG

1 100 910 100000 67150 

結果運行此更新查詢後update test set AMOUNT=-500 where AMOUNT=-200

REPORT_ID AMOUNT MY_ID FUND ORG 
1 100 910 100000 67150 
2 -500 910 100000 67120 
2 200 910 100000 67130 
+0

數量= -200不應該根據您的數據得到結果,因爲它具有與200和-200相同的report_id和相同的MY_ID。這將被查詢丟棄。 – johnny

1

編輯:

這裏是基於反饋和提供的其他示例數據更新後的查詢。這個查詢的優點是隻查詢一次TEST表,並返回預期結果(3行71,一行100,一行40.17)。

SELECT 
    report_id, MAX(fund) fund, my_id, MAX(org) org, SUM(amount) amount 
FROM (
    SELECT 
     report_id, fund, my_id, org, amount 
     , ROW_NUMBER() OVER(PARTITION BY report_id, my_id, amount) rn 
    FROM 
     test 
) t 
GROUP BY 
    rn, ABS(amount), report_id, my_id 
HAVING 
    SUM(amount) > 0; 

結果:

report_id fund my_id org amount 
5   100000 911  67120 71.00 
5   100000 911  67140 71.00 
5   100000 911  67150 71.00 
1   100000 910  67150 40.17 
1   100000 910  67150 100.00 


最初的回答:

下面的查詢應該提供您要查找的內容。如果組織和/或資金不同,我不確定應該做什麼,因爲您沒有將這些值分組 - 我決定在基金和組織中使用MAX彙總函數來選擇單個值,而不影響分組。也許這些專欄應該被排除在外?

SELECT 
    report_id, MAX(fund) fund, my_id, MAX(org) org, SUM(amount) amount 
FROM 
    test 
GROUP BY 
    report_id, my_id, ABS(amount) 
HAVING 
    SUM(amount) > 0; 

結果:

report_id fund my_id org amount 
1   100000 910  67150 40.17 
1   100000 910  67150 100.00 

請注意,根據您提供的樣本數據,預期的結果不應該表現出200,因爲有對同一REPORT_ID相應-200(2),並添加my_id(910 )。

+0

肖恩你是對的,這是非常接近,但我需要得到的資金和不匹配項目的組織已匹配。因此max org不適合我。試想一下,如果你在一張紙上有兩張紙,你會得到一定數量的紙張,而在另一張紙張上則會有額外的數量你會嚴格地使用高亮度和高亮度來對消極情緒進行消極評估。一旦你完成,你會留下一些積極的數額和額外的數據。這就是我試圖在這裏完成的。 – Miguel

+0

@Miguel - 請看下面的數據:

'REPORT_ID基金組織添加my_id量 1 100000 910 67150 60.00 1 100000 910 67151 -60.00 1 100000 910 67152 60.00'

我們將表明60.00的量。我們應該展示哪些組織? 67150或67152? –

+0

抱歉,我錯過了要發佈一些數據的內容嗎? – Miguel