我具有类似于此的表,该表将是SQLSQL基的通过在柱(值)(计数(ID)> 1)
ID Value
FRY6040501ACH19 1388
FRY6040501ACH19 1389
FRY6040501ACH19 1388
<Null> 13800
<Null> 13800
<Null> <Null>
0026003710022745 1388
0026003710022752 <Null>
0026003710022751 32750
0026003710022751 32750
0026003710022751 32750
输入我需要编写一个SQL来获得输出,其他Status
列。
我加入中间列TmpCntID
& TmpCntVl
解释逻辑
从SQL的所需输出如下:(TmpCntID
& TmpCntVl
不是必需的)
ID TmpCntID Value TmpCntVl Status
FRY6040501ACH19 3 1388 2 MisMatch
FRY6040501ACH19 3 1389 1 MisMatch
FRY6040501ACH19 3 1388 2 MisMatch
<Null> 3 13800 2 MisMatch
<Null> 3 13800 2 MisMatch
<Null> 3 <Null> 1 MisMatch
0026003710022745 1 1388 1 NA
0026003710022752 1 <Null> 1 NA
0026003710022751 3 32750 3 Match
0026003710022751 3 32750 3 Match
0026003710022751 3 32750 3 Match
这里所用的逻辑是首先使用SELECT ID, Count(*) FROM MyTable M GROUP BY IIF(IsNull(ID), '0', ID), ID having COUNT(*)>1
来查找ID的重复,以获得中间输出,如下所示:
NDUPID TmpCntID
FRY6040501ACH19 3
<Null> 3
0026003710022751 3
现在,对于一个时刻,我们需要忽略ID的其余像0026003710022745
或0026003710022752
从第一台以上每个ID
这是NDUPID (above intermediate output)
找到非重复values
。任何一个不重复的必须标明所有行具有相同的ID
是Mismatch
例如针对ID=0026003710022751
,我们可以看到所有三个values=32750
,因此Status=Match
和ID=FRY6040501ACH19
和ID=<Null>
我们至少有一个重复value
因此它是Status=Mismatch
而在上面的输出表有TmpCntID=1
所有行,我们需要记住Status=NA
逻辑是计算TmpCntVl
和TmpCntID
第一但是不需要在最终的输出,然后利用case语句如果两个列相等然后Match
如果两列不相等然后MisMatch
和所有ID
的不在中间输出表的上方,即count(*)<=1
状态将为NA
您的帮助将非常感激。
是的,但我需要得到'TmpCntVl'和'TmpCntID'。我面临的难关'TmpCntVl'形式'输入的SQL'表 – user1992408
逻辑的一点是,计算'TmpCntVl'和'TmpCntID'第一,那么情况就发现如果两个列相等,然后'Match'如果两个列不相等则'MisMatch' – user1992408
让我ID,请尝试类似于'组的东西,Value'左外连接'组由ID'上ID但目前尚不清楚... – user1992408