在RODBC sqlQuery()函数中用字符串替换NA

时间:2018-04-05 22:08:41

标签: sql r

如何在NA中使用RODBC数据库语言时替换R个项目?

我经常搜索,但似乎没有COALESCEIFNULL函数,我也试过CASE运算符,但没有运气!

这是我的查询。在结果中,我想使用类似Not Captured的字符串而不是<NA>

sql <- "SELECT PRODUCT_LINE, COUNT(*) AS MMR_Count,
ROUND((COUNT(*)*100/(SELECT COUNT(MMR_NBR) FROM hist_mmr)),2) AS per
FROM hist_MMR
GROUP BY PRODUCT_LINE
ORDER BY COUNT(PRODUCT_LINE) DESC"

df <- sqlQuery( db , sql) 

head(df,10)

结果:

  PRODUCT_LINE MMR_Count   per
1     SECURITY       688 43.60
2     PLUMBING       320 20.28
3     HARDWARE        80  5.07
4         <NA>       490 31.05

期望的结果:

PRODUCT_LINE MMR_Count   per
  PRODUCT_LINE MMR_Count   per
1     SECURITY       688 43.60
2     PLUMBING       320 20.28
3     HARDWARE        80  5.07
4 Not Captured       490 31.05

1 个答案:

答案 0 :(得分:0)

当连接到SQL Server,PostgreSQL和SQLite时,这适用于我。当然,它没有使用RODBC,但我怀疑你的需求更多是以SQL为中心而不是RODBC特定的。

dbGetQuery(con, "select (case when 1=2 then 'a' else 'b' end) as a")
#   a
# 1 b

所以在你的情况下,我怀疑这可行(未经测试):

sql <- "
  SELECT 
    (case when PRODUCT_LINE is null then 'No Captured' else PRODUCT_LINE end),
    COUNT(*) AS MMR_Count,
    ROUND((COUNT(*)*100/(SELECT COUNT(MMR_NBR) FROM hist_mmr)),2) AS per
  FROM hist_MMR
  GROUP BY PRODUCT_LINE
  ORDER BY COUNT(PRODUCT_LINE) DESC
"

(为了记录,我使用DBI RSQLServerRPostgresRSQLite来使用{{3}}。)

你也可以用R来解决这个问题:

df$PRODUCT_LINE[is.na(df$PRODUCT_LINE)] <- "Not Captured"