2016-03-21 201 views
0

我使用SQL Server 2012,並執行以下查詢:SQL篩選查詢重複結果

SELECT StockAct.CodAlm, StockAct.CodArt, MovStock.units 
FROM MovStock, 
    StockAct 
WHERE MovStock.CodArt = StockAct.CodArt 
    AND MovStock.CodAlm = StockAct.CodAlm 

,結果是這樣的:

CodAlm CodArt Units 

0001 BA2 -25 
0001 BA2 -25 
0001 BA2 -25 
0002 BA2 -9 
0002 BA2 -9 
0002 BA2 -9 
0002 BA2 -9 
0003 BA2 60 
0003 BA2 60 
0003 BA2 60 
0003 BA2 60 

這樣做的目的是使查詢或東西返回在零的重複值(第一個除外):

0001 BA2 -25 
0001 BA2 0 
0001 BA2 0 
0002 BA2 -9 
0002 BA2 0 
0002 BA2 0 
0002 BA2 0 
0003 BA2 60 
0003 BA2 0 
0003 BA2 0 
0003 BA2 0 

的值總是重複(因此它們是1 1 1,2 2 2 ... n n n)。

考慮到每一種情況,連續的結果可能是3或4。

GROUP BYDISTINCT不工作,因爲查詢返回更多的列有不同的值,他們不相等(我只顯示這些以減輕這個例子)。

在其他編程語言中,可以通過如下方式解決:如果codalm和codart與上一個結果匹配,則顯示0,否則顯示 units.value

任何想法?謝謝。

+0

在這個例子中,你可以分享你的餐桌數據('MovStock'和'StockAct')嗎? – SmartDev

+0

SQL表和結果集表示*無序*集。除非另一列明確定義排序,否則組中沒有第一行。 –

+0

我想,但他們太大了:D – jinfo

回答

0

您可以使用row_number來分配行號。然後使用case表達式爲每個組選擇第一行的實際單位,否則爲0。

select codalm,codart, 
case when rn = 1 then units else 0 end as units 
from (
SELECT StockAct.CodAlm, StockAct.CodArt,MovStock.units 
,row_number() over(partition by StockAct.CodAlm, StockAct.CodArt,MovStock.units 
        order by StockAct.CodAlm, StockAct.CodArt,MovStock.units) as rn 
FROM MovStock 
JOIN StockAct ON MovStock.CodArt = StockAct.CodArt AND MovStock.CodAlm = StockAct.CodAlm) t 
+0

我相信你需要'codalm,codart,rn'命令才能一直工作。 –

+0

@GordonLinoff ..我認爲'訂單由null'會和'codalm,codart,rn'一樣工作。如果我錯了,請糾正我的錯誤? –

+0

謝謝!我認爲它的工作 – jinfo