2016-03-21 111 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