R中的SQL脚本仅提供有限数量的观察

Posted

技术标签:

【中文标题】R中的SQL脚本仅提供有限数量的观察【英文标题】:SQL script in R giving only limited number of observation 【发布时间】:2020-03-11 14:37:16 【问题描述】:

我正在 R Studio 中运行 SQL 脚本并连接到 SAP HANA 服务器。每次,我运行脚本它只会给我有限的观察结果。有时,我得到 800 个观察结果,有时得到 1000 个观察结果。 在 Tableau 或 SSMS 中运行此 SQL 脚本时,我得到了数百万个观察结果。

谁能帮忙,为什么 R 只给出有限的行?

下面是我正在使用的代码

library(RODBC)

ch <- odbcConnect('HANAxxx',uid='xxxxx',pwd='xxxxx', DBMSencoding="UTF-8")

fiscqtr <- as.character(20191)
begqtr <- as.character(201901)
endqtr <- as.character(201913)
avginvBOP <- as.character(201850)
avginvEOP <- as.character(as.numeric(endqtr)-1)
eopweek <- endqtr
receiptstart <- as.character(201850)
receiptend <- as.character(as.numeric(endqtr)-2)

sales <- sqlQuery(ch, paste('SELECT

                            mat."DIVISION_TXT" AS Division_Name,
                            mat."DEPARTMENT_TXT" AS Department_Name,
                            mat."CLASS_TXT" AS Class_Name,
                            mat."yz_abc1" AS Base_Style_ID,
                            mat."yz_abc1_TXT" AS Base_Style_Name,
                            mat."COLOR" AS Color_Code,
                            mat."COLOR_TXT" AS Color_Name,

                            SUM(CASE WHEN (r."ZWEEK" BETWEEN \'',begqtr,'\' AND \'',endqtr,'\') THEN r."SALES" ELSE 0 END) AS NET_SLS$,
                            SUM(CASE WHEN (r."ZWEEK" BETWEEN \'',begqtr,'\' AND \'',endqtr,'\') THEN r."COST" ELSE 0 END) AS NET_SLSC,
                            SUM(CASE WHEN (r."ZWEEK" BETWEEN \'',begqtr,'\' AND \'',endqtr,'\') THEN r."UNIT" ELSE 0 END) AS NET_SLSU,
                            SUM(CASE WHEN (r."ZWEEK" = \'',eopweek,'\') THEN r."ONHAND" ELSE 0 END) AS EOP_INV_UNIT,    
                            SUM(CASE WHEN (r."ZWEEK" = \'',eopweek,'\') THEN r."ONHANDCOST" ELSE 0 END) AS EOP_INV_COST,    
                            AVG(CASE WHEN (r."ZWEEK" BETWEEN \'',avginvBOP,'\' AND \'',avginvEOP,'\') THEN r."ONHAND" ELSE 0 END) AS BOP_INV_UNIT,  
                            AVG(CASE WHEN (r."ZWEEK" BETWEEN \'',avginvBOP,'\' AND \'',avginvEOP,'\') THEN r."ONHANDCOST" ELSE 0 END) AS BOP_INV_COST,              
                            SUM(CASE WHEN (r."ZWEEK" BETWEEN \'',receiptstart,'\' AND \'',receiptend,'\') THEN r."RECEIPU" ELSE 0 END) AS RECEIPT_UNITS,
                            SUM(CASE WHEN (r."ZWEEK" BETWEEN \'',receiptstart,'\' AND \'',receiptend,'\') THEN r."RECEIPC" ELSE 0 END) AS RECEIPT_COST


                            FROM "_SYS_BIC"."ZBHD.bw.bw2hana/XYZ_REPORT" As r
                            LEFT JOIN "_SYS_BIC"."ZBHD.bw.bw2hana/XYZ_MASTERMATERIAL" As mat On r."0MATERIAL" = mat."MATERIAL"

                            WHERE mat."DIVISION" IN (\'A\',\'B\',\'C\',\'D\',\'E\')
                            AND mat."MATL_TYPE" = \'RECENT\'


                            GROUP BY

                            mat."DIVISION_TXT",
                            mat."DEPARTMENT_TXT",
                            mat."CLASS_TXT",
                            mat."yz_abc1",
                            mat."yz_abc1_TXT",
                            mat."COLOR",
                            mat."COLOR_TXT"', sep = ''))

【问题讨论】:

结果表中是否存在编码问题? IE。特殊字符 你可以尝试使用odbc包。 (抱歉,不是解决这个问题的方法,但是......)您可能需要考虑参数化查询,而不是手动构建查询字符串。尽管对恶意 SQL injection(例如 XKCD 的 Exploits of a Mom aka “Little Bobby Tables”)存在安全问题,但它也是对格式错误的字符串或 Unicode-vs-ANSI 问题的担忧,即使它是运行询问。 DBI(带有odbc)和RODBC 包都支持参数化查询,无论是本机还是通过插件。 我不知道RODBC 是否是这里的罪魁祸首。使用DBIodbc 运行相同的查询以查看是否可以重现该问题会很有帮助。我认为这也很容易测试:ch &lt;- DBI::dbConnect(...)(相同的参数)和sales &lt;- DBI::dbGetQuery(ch, paste(...))(相同的查询)应该是一个足够的开始。 (然后研究参数化。)缺少这一点,您是否尝试过使用 RODBC 的 max= 参数来强制解决问题? (默认为0,应该没有限制,只是一个想法。) @GonzaloFallouxCosta 不,结果表中没有编码问题。查询运行,然后仅产生整数个观察值。比如 200、300、800、1000 等等..... 【参考方案1】:

我其实是通过安装RJDBC包和安装jdbcDriver解决了一个错误。它工作得很好......谢谢你的帮助。

下面是安装驱动和连接HANA的代码

jdbcDriver

ch

【讨论】:

以上是关于R中的SQL脚本仅提供有限数量的观察的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft SQL Server Management Studio 中的 R 脚本

在 h2 数据库 sql 脚本中不起作用

从 python 运行 sql 脚本时如何仅抑制 SQL*Plus 横幅消息

部署后脚本中 :r 引用的脚本显示错误

使用 R 中定义的变量从 R 运行 SQL 脚本

仅使用脚本在 MS SQL Server 之间移动多个表