Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将3个SAS查询组合/转换为1个SQL语句以在R中执行_Sql_Sql Server_R - Fatal编程技术网

如何将3个SAS查询组合/转换为1个SQL语句以在R中执行

如何将3个SAS查询组合/转换为1个SQL语句以在R中执行,sql,sql-server,r,Sql,Sql Server,R,我目前有一个R程序,它从仓库中提取数据并创建一组报告。数据查询使用R中的RODBC库,我目前只有以下查询代码 manifest_query <- " select bkg.syn_sail_key, bkg.sail_ship_cd, bkg.sail_sail_dte, bkg.sail_dura_days, bkg.book_num, bkg.pax_seq_num, bkg.rdate, bkg.cabin,

我目前有一个R程序,它从仓库中提取数据并创建一组报告。数据查询使用R中的RODBC库,我目前只有以下查询代码

manifest_query <- "
  select
    bkg.syn_sail_key,
    bkg.sail_ship_cd,
    bkg.sail_sail_dte,
    bkg.sail_dura_days,
    bkg.book_num,
    bkg.pax_seq_num,
    bkg.rdate,
    bkg.cabin,
    bkg.cabin_book_num,
    bkg.meta_category_code,
    bkg.rate_code,
    bkg.person_num,
    bkg.rdate,
    person.past_guest_num,
    person.first_name,
    person.last_name,
    person.gender,
    person.date_of_birth,
    person.tier_code
  from
    dw.bkg_contact_fact bkg
    inner join dw_crm.person_dim person
    on person.person_num = bkg.person_num
  where
    bkg.cancelled_pax_ind = 'N' and
    bkg.sail_sail_dte >= to_date('%start_date%', 'YYYY-MM-DD') and
    bkg.sail_sail_dte <= to_date('%end_date%', 'YYYY-MM-DD')
  "
在SAS中执行这些操作很容易,因为流程流程允许您轻松使用“工作”表,但我的问题是:

  • 如何将SAS查询转换为R将读取的正确SQL语法
  • 在这段代码中,我可以将查询嵌套到一个block语句中,这样我只需要运行查询命令一次吗
  • 或者,如何执行多个查询以获得与SAS中相同的表结果

您可以使用与proc sql中语法类似的
库(sqldf)
。您的第一个SAS sql代码是否会生成有关重新合并统计信息的警告?如果是这样,它将不会直接转换为R。不,没有错误。代码当前正在运行,并且生成的输出非常完美。第一个片段直接从工作的R代码中提取出来。SAS查询都会执行。我没有将它们组合在一起,因为我不知道如何成功地进行组合,但在它们自己的环境中,给R的文本只是简单地传递给SQL server。如果在SAS Proc中仅将SQL代码用双引号括起来会发生什么?
PROC SQL;
   CREATE TABLE WORK."NEXT_SAIL"n AS 
   SELECT t1.SYN_SAIL_KEY, 
          t1.SAIL_DURA_DAYS, 
          t1.SAIL_SAIL_DTE, 
          t1.SAIL_SHIP_CD, 
          t1.RDATE, 
          t1.CABIN_BOOK_NUM, 
          t1.BOOK_NUM, 
          t1.PAX_SEQ_NUM, 
          t1.CABIN, 
          t1.RATE_CODE, 
          t1.PERSON_NUM, 
          t1.FIRST_NAME, 
          t1.LAST_NAME, 
          t1.PAST_GUEST_NUM, 
          t1.GENDER, 
          t1.DATE_OF_BIRTH, 
          t1.TIER_CODE, 
          /* MIN_of_SAIL_SAIL_DTE */
            (MIN(t2.SAIL_SAIL_DTE)) FORMAT=DATETIME20. AS MIN_of_SAIL_SAIL_DTE
      FROM WORK.QUERY_FOR_BKG_CONTACT_FACT t1
           LEFT JOIN DW.BKG_CONTACT_FACT t2 ON (t1.PERSON_NUM = t2.PERSON_NUM) AND (t1.SAIL_SAIL_DTE < t2.SAIL_SAIL_DTE)
      GROUP BY t1.SYN_SAIL_KEY,
               t1.SAIL_DURA_DAYS,
               t1.SAIL_SAIL_DTE,
               t1.SAIL_SHIP_CD,
               t1.RDATE,
               t1.CABIN_BOOK_NUM,
               t1.BOOK_NUM,
               t1.PAX_SEQ_NUM,
               t1.CABIN,
               t1.RATE_CODE,
               t1.PERSON_NUM,
               t1.FIRST_NAME,
               t1.LAST_NAME,
               t1.PAST_GUEST_NUM,
               t1.GENDER,
               t1.DATE_OF_BIRTH
      ORDER BY t1.SAIL_SAIL_DTE;
QUIT;
PROC SQL;
   CREATE TABLE WORK.QUERY_FOR_NEXT_SAIL_0002 AS 
   SELECT t1.SYN_SAIL_KEY, 
          t1.SAIL_DURA_DAYS, 
          t1.SAIL_SAIL_DTE, 
          t1.SAIL_SHIP_CD, 
          t1.RDATE, 
          t1.CABIN_BOOK_NUM, 
          t1.BOOK_NUM, 
          t1.PAX_SEQ_NUM, 
          t1.CABIN, 
          t1.RATE_CODE, 
          t1.PERSON_NUM, 
          t1.FIRST_NAME, 
          t1.LAST_NAME, 
          t1.PAST_GUEST_NUM, 
          t1.GENDER, 
          t1.DATE_OF_BIRTH, 
          t1.MIN_of_SAIL_SAIL_DTE, 
          t2.SAIL_SHIP_CD AS SAIL_SHIP_CD1, 
          t2.RATE_CODE AS RATE_CODE1
      FROM WORK.NEXT_SAIL t1
           LEFT JOIN DW.BKG_CONTACT_FACT t2 ON (t1.PERSON_NUM = t2.PERSON_NUM) AND (t1.MIN_of_SAIL_SAIL_DTE = 
          t2.SAIL_SAIL_DTE AND (t2.PAX_CANCEL_DTE IS MISSING ));
QUIT;