【问题标题】:SQLite in R - error in result_create(conn@ptr, statement) : near ")"R中的SQLite - result_create(conn@ptr,statement)中的错误:靠近“)”
【发布时间】:2019-01-29 01:46:27
【问题描述】:

很抱歉这个基本问题,但我试图在 R 中使用 sqldf 函数运行以下代码,但每次它显示“result_create(conn@ptr, statement) 中的错误:靠近' )': 语法错误”,我找不到错误的确切位置。

我尝试以不同的方式缩进/格式化,但“near ')'”的错误指示一直存在。

似乎所有括号都很好。

代码:

sqldf("

SELECT  Cia_2, Nombre_cia_2, N_orden_2, Tipo_orden_2, N_linea_2, N_direc_2, Nombre_alfa_2, Fecha_orden_2, 
           Surtido_programado_2, Original_prometida_2, 

           N_orden, Tipo_orden, N_linea, Cia, 

           Cant_recibida_2, Cant_pendiente_2, Cantidad_2, estado_sig_2, estado_ult_2, 
           (case when [N_orden_2] is null then 'SinOC' else 'ConOC' end) as TieneOC,

           (case when [Cant_recibida_2]=0 and [Cant_pendiente_2]=0 and [estado_sig_2]=999 then 'Anulada'
           else (case when [Cant_recibida_2] = [Cantidad_2] and [estado_sig_2] = 999 and [Tiene_OC_2] = 'SinOC' then 'Anulada' else 'NoAnulada' )) as Anulada,

           (case when [N_direc_2] = 35999999 then 'Normal'
            else (case when [N_direc_2] = 35999998 then 'Urgente'
                  else (case when [N_direc_2] = 35999997 then 'Emergente'
                        else (case when [N_direc_2] = 35999995 then 'Proyecto'                                                                              
                              else (case when [N_direc_2] = 35999994 then 'Importaciones' else 'Expost' ))))) as TipoReq,

          Unidad_negocios_2, 
          aprob_or_2.LastOfFecha_aprobac, 
          [SumOfOrden de Cambio_2]

          FROM bases_or_con_oc 
          LEFT JOIN aprob_or_2 ON (N_orden = aprob_or_2.N_orden_OR) 
                               AND (Tipo_orden = aprob_or_2.Tipo_ordenOR) 
                               AND (N_linea = aprob_or_2.N_lineaOR)
          WHERE  estado_sig_2 > 110
                               AND (case when [Cant_recibida_2] = 0 and [Cant_pendiente_2] = 0 and [estado_sig_2] = 999 then 'Anulada'
                                    else (case when [Cant_recibida_2] = [Cantidad_2] and [estado_sig_2] = 999 and [Tiene_OC_2] = 'SinOC' 
                                    then 'Anulada' else 'NoAnulada')) = 'noAnulada'
     ")

错误图片:

我也尝试排除一些行,以便找出错误点...

你知道发生了什么吗?

【问题讨论】:

  • CASE 语句不需要用括号括起来。

标签: sql r sqlite rstudio sqldf


【解决方案1】:

你有几个没有结尾的案例,每个案例都必须是一个相关的结尾

  sqldf("

  SELECT  Cia_2, Nombre_cia_2, N_orden_2, Tipo_orden_2, N_linea_2, N_direc_2, Nombre_alfa_2, Fecha_orden_2, 
             Surtido_programado_2, Original_prometida_2, 

             N_orden, Tipo_orden, N_linea, Cia, 

             Cant_recibida_2, Cant_pendiente_2, Cantidad_2, estado_sig_2, estado_ult_2, 
             (case when [N_orden_2] is null then 'SinOC' else 'ConOC' end) as TieneOC,

             (case when [Cant_recibida_2]=0 and [Cant_pendiente_2]=0 and [estado_sig_2]=999 then 'Anulada'
             else (case when [Cant_recibida_2] = [Cantidad_2] and [estado_sig_2] = 999 and [Tiene_OC_2] = 'SinOC' 
                    then 'Anulada' else 'NoAnulada' END) END ) as Anulada,

             (case when [N_direc_2] = 35999999 then 'Normal'
              else (case when [N_direc_2] = 35999998 then 'Urgente'
                    else ( case when [N_direc_2] = 35999997 then 'Emergente'
                          else ( case when [N_direc_2] = 35999995 then 'Proyecto'                                                                              
                                else (case when [N_direc_2] = 35999994 then 'Importaciones' else 'Expost'  END )  END) END)  END) END) as TipoReq,

            Unidad_negocios_2, 
            aprob_or_2.LastOfFecha_aprobac, 
            [SumOfOrden de Cambio_2]

            FROM bases_or_con_oc 
            LEFT JOIN aprob_or_2 ON (N_orden = aprob_or_2.N_orden_OR) 
                                 AND (Tipo_orden = aprob_or_2.Tipo_ordenOR) 
                                 AND (N_linea = aprob_or_2.N_lineaOR)
            WHERE  estado_sig_2 > 110
                                 AND (case when [Cant_recibida_2] = 0 and [Cant_pendiente_2] = 0 and [estado_sig_2] = 999 then 'Anulada'
                                      else ( case when [Cant_recibida_2] = [Cantidad_2] and [estado_sig_2] = 999 and [Tiene_OC_2] = 'SinOC' 
                                      then 'Anulada' else 'NoAnulada' END ) END) = 'noAnulada'
       ")

我希望我没有忘记任何人

【讨论】:

    【解决方案2】:

    考虑使用 SQLite 支持的 CTE 子句 WITH() 简化您的 SQL,以避免在 SELECTWHERE 子句中为 Anulada 重新键入相同的计算列。并确保用END 关闭所有CASE 语句:

    WITH cte AS 
         (SELECT Cia_2, Nombre_cia_2, N_orden_2, Tipo_orden_2, N_linea_2, N_direc_2, 
                 Nombre_alfa_2, Fecha_orden_2, Surtido_programado_2, Original_prometida_2, 
                 N_orden, Tipo_orden, N_linea, Cia, 
                 Cant_recibida_2, Cant_pENDiente_2, Cantidad_2, estado_sig_2, estado_ult_2, 
                 CASE WHEN [N_orden_2] IS NULL THEN 'SinOC' ELSE 'ConOC' END AS TieneOC,
                 CASE 
                     WHEN [Cant_recibida_2]=0 and [Cant_pENDiente_2]=0 AND [estado_sig_2] = 999
                     THEN 'Anulada'
                     ELSE 
                         CASE 
                              WHEN [Cant_recibida_2] = [Cantidad_2] AND [estado_sig_2] = 999 and [Tiene_OC_2] = 'SinOC' 
                              THEN 'Anulada' 
                              ELSE 'NoAnulada' 
                         END
                 END AS Anulada,        
                 CASE [N_direc_2] 
                      WHEN 35999999 THEN 'Normal'
                      WHEN 35999998 THEN 'Urgente'
                      WHEN 35999997 THEN 'Emergente'
                      WHEN 35999995 THEN 'Proyecto'
                      WHEN 35999994 THEN 'Importaciones' 
                      ELSE 'Expost' 
                 END AS TipoReq,        
                 Unidad_negocios_2, aprob_or_2.LastOfFecha_aprobac, [SumOfOrden de Cambio_2]
    
          FROM bases_or_con_oc 
          LEFT JOIN aprob_or_2 ON (N_orden = aprob_or_2.N_orden_OR) 
                AND (Tipo_orden = aprob_or_2.Tipo_ordenOR) 
                AND (N_linea = aprob_or_2.N_lineaOR)
          WHERE  estado_sig_2 > 110
         )
    
    SELECT * FROM cte WHERE [Anulada] = 'NoAnulada';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      相关资源
      最近更新 更多