Skip to content
Prev 371301 / 398530 Next

Case statement in sqldf

2018-03-3 in your code should be 2018-03-31.

The line
    then'201415'
needs to be fixed.

When posting please provide minimal self-contained examples. There was
no input provided and library statements not relevant to the posted
code were included.

Fixing the invalid date and bad line, getting rid of those library
statements that are unnecessary and providing some test input, it
works for me for the input shown.

(Note that it would NOT work if we omitted library(RH2) since the
default sqlite back end does not have date types and does not know
that an R date -- which is sent to sqlite as the number of days since
1970-01-01 -- corresponds to a particular character string; however,
the H2 database does have date types.  See FAQ #4 on the sqldf github
home page for more info.
    https://github.com/ggrothendieck/sqldf
)

This works:

library(sqldf)
library(RH2)

cr <- data.frame(ReportDate = as.Date("2017-09-11")) # input

cr2 =  sqldf(" select ReportDate
                     ,  case
                       when ReportDate between  '2012-04-01'  and  '2013-03-31'
                       then '2012_13'
                       when  ReportDate between '2013-04-01'  and  '2014-03-31'
                       then '2013_14'
                       when  ReportDate between  '2014-04-01'  and  '2015-03-31'
                       then '2014_15'
                       when ReportDate between '2015-04-01'  and  '2016-03-31'
                       then '2015_16'
                       when ReportDate between '2016-04-01'  and  '2017-03-31'
                       then '2016_17'
                       when ReportDate between '2017-04-01'  and  '2018-03-31'
                      then '2017_18' else null
             end as FY
             from cr
             where  ReportDate  >=  '2012-04-01'
             ")

giving:

  > cr2
    ReportDate      FY
  1 2017-09-11 2017_18

Note that using as.yearqtr from zoo this alternative could be used:

library(zoo)
cr <- data.frame(ReportDate = as.Date("2017-09-11")) # input

fy <- as.integer(as.yearqtr(cr$ReportDate) + 3/4)
transform(cr, FY = paste0(fy-1, "_", fy %% 100))

giving:

  ReportDate      FY
1 2017-09-11 2017_18


On Mon, Sep 11, 2017 at 4:05 AM, Mangalani Peter Makananisa
<pmakananisa at sars.gov.za> wrote: