R中的sqldf为SQL CASE语句中的所有行返回NA

时间:2019-01-03 23:38:42

标签: sql r sql-server sqldf

我在R中有一个名为“ data”的数据框。 EventDate列为date format,其余为double或字符字段。

我正在尝试从“ data”中提取大多数列,但是将aggregate的{​​{1}}值设置为年月指定,而不是当前的年月日指定(所以我想以01-2018、02-2018、03-2018等作为行值结束)。

在base R上执行此操作或找到任何易于执行的软件包时遇到很多麻烦。我在SQL方面比R有更多的经验,所以我选择使用sqldf软件包。

这是我写的代码:

EventDate

该代码执行没有任何问题,并且产生了大部分正确的结果,只不过它为newdata <- sqldf("SELECT ID1, ID2, ID3, Staff, Type, POC, TOC1, TOC2, TOC3, CASE WHEN EventDate >= '2018-01-01' AND EventDate < '2018-02-01' THEN 'Jan 2018' WHEN EventDate >= '2018-02-01' AND EventDate < '2018-03-01' THEN 'Feb 2018' WHEN EventDate >= '2018-03-01' AND EventDate < '2018-04-01' THEN 'Mar 2018' WHEN EventDate >= '2018-04-01' AND EventDate < '2018-05-01' THEN 'Apr 2018' WHEN EventDate >= '2018-05-01' AND EventDate < '2018-06-01' THEN 'May 2018' WHEN EventDate >= '2018-06-01' AND EventDate < '2018-07-01' THEN 'Jun 2018' WHEN EventDate >= '2018-07-01' AND EventDate < '2018-08-01' THEN 'Jul 2018' WHEN EventDate >= '2018-08-01' AND EventDate < '2018-09-01' THEN 'Aug 2018' WHEN EventDate >= '2018-09-01' AND EventDate < '2018-10-01' THEN 'Sep 2018' WHEN EventDate >= '2018-10-01' AND EventDate < '2018-11-01' THEN 'Oct 2018' WHEN EventDate >= '2018-11-01' AND EventDate < '2018-12-01' THEN 'Nov 2018' WHEN EventDate >= '2018-12-01' AND EventDate < '2019-01-01' THEN 'Dec 2018' END AS EventMonth FROM data ORDER BY EventMonth, Staff, ID1") 的{​​{1}}列中的所有行而不是NA返回了EventMonth

newdata”中的"Jan 2018", "Feb 2018"列可能是格式问题,但是EventDate在RStudio中被列为日期类型,并且在data中。

在运行之前的代码作为健全性检查之前,我还尝试运行以下命令(不会出错或不会发出任何警告),但是它仍然为我提供了EventMonth充满NA的列:

data$EventDate

当我在SQL Server中运行它时,SQL产生了预期的结果(EventMonth列中没有NA),但是不幸的是,我将永远无法访问SQL Server,这就是为什么我不愿意这样做完全是R。

我需要一种无需实际的SQL数据库引擎即可执行此操作的方法,以便将来执行类似的聚合。我最近在上个月内安装了yyyy-mm-dd formatdata$EventDate <- as.Date(data$EventDate) R软件包,所以我不应该使用任何过时的工具。

是否可以使用 sqldf,基本R或某些其他R包来获得所需的结果?

1 个答案:

答案 0 :(得分:0)

是否可以使用SQLquery代替sqldf。如果是,您的查询可能会以这种方式工作。

我在SQL Server中有一个这样的表。

enter image description here

您可以使用R连接到SQL Server。

 library(odbc)
 library(RODBC)
 library(sqldf)

 conn <- odbcDriverConnect('driver={SQL Server};server= 
 YOURserver;database=Yourdatabase;trusted_connection=true')

  Datanew <- sqlQuery(conn,"SELECT ID,Dates,Amount  ,
  case when Dates >= '2018-01-01' and Dates < '2018-02-01' then 'Jan 2018'
                when Dates >= '2018-02-01' and Dates < '2018-03-01' then 'Feb 2018' 
                when Dates >= '2018-03-01' and Dates < '2018-04-01' then 'Mar 2018' 
  end as Months, 
                 format(dates,'MMM yyyy') NewapproachDates
                FROM dbo.practicR;"); 

View(Datanew) 

您将日期转换为月和年的case语句是正确的,但是这种格式功能将更加容易,因为您不必像在case语句中那样每次都给出日期范围。日期有两列(一种是您提供的方式,另一种是新方式)

输出是这样:

enter image description here