我有一个与此类似的表,它是SQL 的输入
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
这里使用的逻辑是首先找到重复使用的 ID,SELECT ID, Count(*) FROM MyTable M GROUP BY IIF(IsNull(ID), '0', ID), ID having COUNT(*)>1
以获取中间输出:
NDUPID TmpCntID
FRY6040501ACH19 3
<Null> 3
0026003710022751 3
现在,我们需要暂时忽略 ID 的其余部分,例如0026003710022745
或0026003710022752
从上面的第一个表ID
中NDUPID (above intermediate output)
找到 non-duplicate中的每个values
。任何一个非重复必须指示所有具有相同的ID
行Mismatch
例如,反对ID=0026003710022751
,我们可以看到所有三个values=32750
,因此Status=Match
和 forID=FRY6040501ACH19
并且ID=<Null>
我们至少有一个重复value
,因此它是Status=Mismatch
在上面的所有行的输出表中TmpCntID=1
,我们需要有Status=NA
记住的逻辑是计算TmpCntVl
,TmpCntID
但首先在最终输出中不需要,然后使用 case 语句,如果两列相等,那么Match
如果两列不相等,那么对于上面中间输出表中没有MisMatch
的所有ID
' ,即状态将是count(*)<=1
NA
您的帮助将不胜感激。