我是 VBA 新手,我想知道如何有条件地构建新列: 我想从 cl.CD_EVT 列创建 VENTE 列:
cl.CD_EVT(如果 cl.CD_EVT 位于 ('COPVT','XCOPVT','3 COPVT','COCVT','XCOCVT','3 COCVT'),则 VENTE="OU",否则 VENTE="非“),”
但我认为这不是 VBA 的正确语法。
我的代码是:
RECSET2.Open " select dossier.NO_POLICE, ev1.D_EFFET, ev1.ID_FAMILLE_PORTEF, ev1.ID_PORTEFEUILLE, gr.LB_COURT_GR_EVT, pers1.S_PRENOM||' '||pers1.S_NOM as Collaborateur, proto.CD_PROTOCOLE, ev1.ID_FAMILLE_PORTEF,comm.L_COMMENT_DOSSIER," & _
" dossier.UI_CREATION, ev1.LP_STATUT_EVT, sum(ev3.MT_BRUT) as Ecart, ev1.MT_BRUT, cl.CD_EVT (case cl.CD_EVT when 'COPVT' then 'OUI' when 'XCOPVT' then 'OUI' when '3 COPVT' then 'OUI' when 'COCVT' then 'OUI' when 'XCOCVT' then 'OUI' when '3 COCVT' then OUI else 'NON') as VENTE," & _
" tiers2.CD_TIERS as Tmandataire, pers3.S_RAISONSOC as Mandataire,tiers1.CD_TIERS as Tdepositaire, pers2.S_RAISONSOC as Depositaire, ev1.IS_EVENEMENT from DB_DOSSIER dossier left join DB_EVENEMENT ev1 " & _
感谢您的帮助!
最佳答案
您正在寻找CASE WHEN...THEN...END
;将您的 if
条件移至 WHEN
分支,如下所示:
,CASE WHEN cl.CD_EVT IN ('COPVT','XCOPVT','3 COPVT','COCVT','XCOCVT','3 COCVT') THEN 'OUI'
ELSE 'NON'
END AS VENTE
确保引号也是一致的“单引号”
;您只需使用“双引号”来分隔 VBA 字符串文字。
如果将 SQL 连接到单独的指令中,比将其发送到连接的位置更容易调试:
Dim sql As String
sql = "SELECT .... FROM .... INNER JOIN .... WHERE ...."
Debug.Print sql '<< print the actual concatenated query string,
'then you can copy to your favorite SQL client, debug it with an actual SQL editor,
'and then come back here and fix the string accordingly!
RECSET2.Open sql, ...
在 SQL 编辑器中编辑/调试 SQL 比在 VBA 字符串文本中编辑/调试 SQL 容易得多:
SELECT
dossier.NO_POLICE,
ev1.D_EFFET,
ev1.ID_FAMILLE_PORTEF,
ev1.ID_PORTEFEUILLE,
gr.LB_COURT_GR_EVT,
pers1.S_PRENOM||' '||pers1.S_NOM as Collaborateur,
proto.CD_PROTOCOLE,
ev1.ID_FAMILLE_PORTEF,
comm.L_COMMENT_DOSSIER,
dossier.UI_CREATION,
ev1.LP_STATUT_EVT,
sum(ev3.MT_BRUT) as Ecart,
ev1.MT_BRUT,
-- this is where the problem is:
cl.CD_EVT(case when cl.CD_EVT in ('COPVT','XCOPVT','3 COPVT','COCVT','XCOCVT','3 COCVT') then 'OUI' else 'NON' end) as VENTE,
tiers2.CD_TIERS as Tmandataire,
pers3.S_RAISONSOC as Mandataire,
tiers1.CD_TIERS as Tdepositaire,
pers2.S_RAISONSOC as Depositaire,
ev1.IS_EVENEMENT
FROM DB_DOSSIER dossier
left join DB_EVENEMENT ev1 on dossier.IS_DOSSIER = ev1.IS_DOSSIER
left join DB_EVENEMENT ev2 on ev1.IS_EVENEMENT=ev2.IS_EVENEMENT_PERE
left join DR_LIEN_EVT drevl on ev2.IS_EVENEMENT=drevl.IS_EVENEMENT
left join DB_EVENEMENT ev3 on drevl.IS_EVT_LIE=ev3.IS_EVENEMENT
left join DP_CLASSE_EVT cl on ev1.IS_CLASSE_EVT=cl.IS_CLASSE_EVT
left join DP_GROUPE_EVT gr on cl.IS_GR_EVT=gr.IS_GR_EVT
left join DB_COMMENT_DOSSIER comm on dossier.IS_DOSSIER=comm.IS_DOSSIER
left join DR_COLLABORATEUR_PROTOCOLE collabproto on dossier.IS_PROTOCOLE=collabproto.IS_PROTOCOLE
left join DB_COLLABORATEUR collab on collabproto.IS_COLLABORATEUR=collab.IS_COLLABORATEUR
left join DB_PERSONNE pers1 on collab.IS_PERSONNE=pers1.IS_PERSONNE
left join DB_PROTOCOLE proto on dossier.IS_PROTOCOLE=proto.IS_PROTOCOLE
left join DB_PORTEFEUILLE portef1 on ev1.ID_FAMILLE_PORTEF=portef1.ID_FAMILLE_PORTEF and ev1.ID_PORTEFEUILLE=portef1.ID_PORTEFEUILLE
left join DB_TIERS tiers1 on tiers1.IS_TIERS=portef1.IS_TIERS_DEPOSITAIRE
left join DB_PERSONNE pers2 on tiers1.IS_PERSONNE=pers2.IS_PERSONNE
left join DB_TIERS tiers2 on tiers2.IS_TIERS=portef1.IS_TIERS_GESTIONNAIRE
left join DB_PERSONNE pers3 on tiers2.IS_PERSONNE=pers3.IS_PERSONNE
WHERE
dossier.CD_DOSSIER in ('COROP','COROC')
and dossier.LP_ETAT_DOSS not in ('CLOSE','ANNUL','A30')
and ev1.D_EFFET>=@date and ev1.IS_EVENEMENT_PERE is null
GROUP BY
dossier.NO_POLICE,
ev1.D_EFFET,
ev1.ID_FAMILLE_PORTEF,
ev1.ID_PORTEFEUILLE,
gr.LB_COURT_GR_EVT,
pers1.S_PRENOM,
pers1.S_NOM,
proto.CD_PROTOCOLE,
ev1.ID_FAMILLE_PORTEF,
comm.L_COMMENT_DOSSIER,
dossier.UI_CREATION,
ev1.LP_STATUT_EVT,
ev1.MT_BRUT,cl.CD_EVT,
tiers2.CD_TIERS,
pers3.S_RAISONSOC,
tiers1.CD_TIERS,
pers2.S_RAISONSOC,
ev1.IS_EVENEMENT
旁注,这是很多LEFT JOIN
;如果其中任何一个可以更改为INNER JOIN
,请考虑这样做,它应该会稍微提高查询性能。
所以问题就在这里:
cl.CD_EVT(case when cl.CD_EVT in ('COPVT','XCOPVT','3 COPVT','COCVT','XCOCVT','3 COCVT') then 'OUI' else 'NON' end) as VENTE,
应该是:
case when cl.CD_EVT in ('COPVT','XCOPVT','3 COPVT','COCVT','XCOCVT','3 COCVT') then 'OUI' else 'NON' end) as VENTE,
然后我预计 GROUP BY
子句会提示 cl.CD_EVT
丢失;确保 GROUP BY
子句包含 SELECT
子句中的所有非聚合列。
关于sql - 阿DODB : if in sql clause,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67005471/