我有一个与此类似的表,它是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(*)<=1NA
您的帮助将不胜感激。