2016-09-26 55 views
0

MS Access 2016MS Access VBA/SQL检查任何儿童

目标,基于子参数的标记记录;例如:

Cat1 Cat2 
A  1 
A  2 
A  5 
B  3 
B  4 
B  1 
C  3 
C  2 
C  5 

集团内的目标通过检查是否存在3并标记w /“FBWT”;结果:

Cat1 Cat2 
A  Other 
B  FBWT 
C  FBWT 

我想过创建基于CAT1,更新基础上,通过CAT1 /2双然后打印“其他”或“FBWT”迭代值字典,但这将在数以百万计的记录跑得那么我理想的是寻找一个函数,我可以在查询中运行Cat1上的groupby。

回答

1

使用条件汇总:

select cat1, 
     min(iif(cat2 = 3, 'FBWT' 'Other')) 
from t 
group by cat1; 

它使用MIN()为有点短切的。字符串是这样的:'FBWT' < 'Other'

这样做的一个更正式的方式是比较明确的:

select cat1, 
     iif(sum(iif(cat2 = 3, 1, 0) > 0, 'FBWT', 'Other') 
from t 
group by cat1; 
+0

为什么FBWT Schalton

+0

它是基于长度还是按字母顺序? – Schalton

+0

我最终只能做到: 从cat1中选择cat1,min(cat2) – Schalton

0

这样的事情,但更有效:

Function IsFBwT(ByVal tblName As String, ByVal JVID As String) 
    Dim rs As DAO.Recordset 
    cTblStr = "SELECT [" & tblName & "].[FBwT IND] FROM [" & tblName & "] WHERE ((([" & tblName & "].[Journal Voucher ID])=" & Chr(34) & JVID & Chr(34) & "));" 
    Set rs = CurrentDb.OpenRecordset(cTblStr) 

    IsFBwT = "Other" 
    rs.MoveNext 
    Do Until rs.EOF 
     If rs("FBwT IND").Value = "FBwT" Then 
      IsFBwT = "FBwT" 
      Exit Function 
     End If 
     rs.MoveNext 
    Loop 
End Function 
0

下面是标准的SQL,这意味着它可能会或可能无法正常工作in Accessland:

UPDATE TargetTable t 
    SET t.Cat2 = 'FBWT' 
WHERE EXISTS (SELECT * 
        FROM SourceTable s 
       WHERE s.Cat1 = t.Cat1 
         AND s.Cat2 = 3);