SQLite in R - error in result_create(conn@ptr, statement) : near “)”

孤者浪人 提交于 2019-12-11 15:18:48

问题


Sorry for the basic question, but I am trying to run the following code with sqldf function in R, but every time it shows "Error in result_create(conn@ptr, statement) : near ')': syntax error" and I can't find exactly where the error is.

I tried to indent/format in different ways but the error indication to "near ')'" persists all the time.

It seems all parenthesis are fine.

Code:

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'
     ")

error image:

I also tried to exclude some lines in order to and find out the error point...

Do you know what's happening?


回答1:


You have several case without end each case must be a related end

  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'
       ")

I hope I have not forgotten anyone




回答2:


Consider simplifying your SQL using the CTE clause, WITH(), supported by SQLite to avoid retyping same calculated column for Anulada in SELECT and WHERE clauses. And be sure to close all CASE statements with END:

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';


来源:https://stackoverflow.com/questions/51972937/sqlite-in-r-error-in-result-createconnptr-statement-near

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!