sql - 阿DODB : if in sql clause

标签 sql excel vba

我是 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/

相关文章:

c++ - 将字符串从 VBA 传递到 C++ DLL

excel - 如何在Excel中使用VBA截断数字而不是四舍五入?

excel - 根据 Interior.ColorIndex 查找范围 - 提高性能

java - IllegalSelectQueryException 和 InvalidDataAccessApiUsageException

sql - 用于计算动态表项目的 MS SQL 存储过程

excel - 如何按区域拆分excel数据并将分数从SAS发送到适当的地址?

java - java中将数据写入excel的问题

excel - 限制打印份数

sql - 通过表IMPALA之间的ORDER BY

mysql - 按记录中的最后一个字母排序列