Как вы используете RODB C с запросом, содержащим команды DDL? - PullRequest
1 голос
/ 04 апреля 2020

Я пытаюсь использовать R для очистки выходных данных из следующей команды SQL, однако после завершения загрузки получается пустой набор данных. Основная цель запроса - создать несколько временных рядов для каждого человека в группе. Временные таблицы были использованы из-за размера наборов данных.

это то, что я имею до сих пор:

conn<-odbcConnect("ks208")
Query<-"


---temp table for daily balances
Create Table #dmhi_hist
(rowno_dmddmhi_dmd int,
balance float, 
amount float,
effective date,
)

Insert Into #dmhi_hist

SELECT data_.rowno_dmddmhi_dmd,
       dmd.balance,
       Sum(data_.amount) AS amount,
       data_.effective
FROM   (
       --Top False Cap 
       SELECT dmhi.rowno,
              dmhi.rowno_dmddmhi_dmd,
              0                               AS amount,
              CONVERT(Date, Getdate()) AS effective
       FROM   ks208.dbo.dmd
              INNER JOIN dmon208.dbo.dmhi
                      ON dmd.rowno = dmhi.rowno_dmddmhi_dmd
       UNION
       SELECT dmhi.rowno,
              dmhi.rowno_dmddmhi_dmd,
              dmhi.amount,
              CONVERT(Date, dmhi.effective) AS effective
       FROM   ks208.dbo.dmd
              INNER JOIN ks208.dbo.dmhi
                      ON dmd.rowno = dmhi.rowno_dmddmhi_dmd
       UNION
       SELECT dmhi.rowno,
              dmhi.rowno_dmddmhi_dmd,
              dmhi.amount,
              CONVERT(Date, dmhi.effective) AS effective
       FROM   dmon208.dbo.dmd
              INNER JOIN dmon208.dbo.dmhi
                      ON dmd.rowno = dmhi.rowno_dmddmhi_dmd
        -- False Bottom Cap
        UNION
        SELECT dmhi.rowno,
               dmhi.rowno_dmddmhi_dmd,
               0                                                  AS amount,
               CONVERT(Date, Dateadd(year, -4, Getdate())) AS effective
        FROM   ks208.dbo.dmd
               INNER JOIN dmon208.dbo.dmhi
                       ON dmd.rowno = dmhi.rowno_dmddmhi_dmd) AS data_
       INNER JOIN ks208.dbo.dmd
               ON dmd.rowno = data_.rowno_dmddmhi_dmd
WHERE  Year(data_.effective) >= Year(Getdate()) - 4


GROUP  BY data_.rowno_dmddmhi_dmd,
          data_.effective,
          dmd.balance 

--- Joining the balances and transations to the calandar
DECLARE @start_date DATE = Dateadd(year, -4, Getdate());
DECLARE @end_date DATE = getdate();


    WITH    AllDays
          AS ( SELECT   @start_date AS [Date]
               UNION ALL
               SELECT   DATEADD(DAY, 1, [Date])
               FROM     AllDays
               WHERE    [Date] < @end_date )
Insert Into #dmhi_hist(effective,rowno_dmddmhi_dmd,amount,balance)
     SELECT [Date] as effective,dmd.rowno as rowno_dmddmhi_dmd,isnull(#dmhi_hist.amount,0) as amount,dmd.balance
     FROM   AllDays 
     cross join KS208.dbo.dmd
     left outer join #dmhi_hist on AllDays.Date = #dmhi_hist.effective and dmd.rowno = #dmhi_hist.rowno_dmddmhi_dmd
     OPTION (MAXRECURSION 0)

     select * from #dmhi_hist


"
conn<-odbcConnect("ks208")
dataset <-sqlQuery(conn,Query)

это то, что RODB C просто ограничено запросами или это структура моей команды?

1 Ответ

0 голосов
/ 04 апреля 2020

В вызовах sqlQuery() допускаются только отдельные операторы. Кроме того, вы можете сохранить все в хранимой процедуре и вызвать ее с помощью sqlQuery(). Или, что еще лучше, избегайте необходимости во временной таблице, INSERT или DECLARE строках и расширьте использование общего выражения таблицы (CTE). Это предполагает, что ваша база данных поддерживает рекурсивный и нерекурсивный CTE в одном выражении.

WITH dmhi_hist AS (

   SELECT data_.rowno_dmddmhi_dmd
        , dmd.balance
        , SUM(data_.amount) AS amount
        , data_.effective
   FROM   
     (  
       SELECT dmhi.rowno
              , dmhi.rowno_dmddmhi_dmd
              , 0 AS amount
              , CONVERT(Date, GETDATE()) AS effective
       FROM   ks208.dbo.dmd
       INNER JOIN dmon208.dbo.dmhi
          ON dmd.rowno = dmhi.rowno_dmddmhi_dmd

       UNION

       SELECT dmhi.rowno
              , dmhi.rowno_dmddmhi_dmd
              , dmhi.amount
              , CONVERT(Date, dmhi.effective) AS effective
       FROM   ks208.dbo.dmd
       INNER JOIN ks208.dbo.dmhi
          ON dmd.rowno = dmhi.rowno_dmddmhi_dmd

       UNION

       SELECT dmhi.rowno
              , dmhi.rowno_dmddmhi_dmd
              , dmhi.amount
              , CONVERT(Date, dmhi.effective) AS effective
       FROM   dmon208.dbo.dmd
       INNER JOIN dmon208.dbo.dmhi
           ON dmd.rowno = dmhi.rowno_dmddmhi_dmd

       UNION

       SELECT dmhi.rowno
              , dmhi.rowno_dmddmhi_dmd
              , 0  AS amount
              , CONVERT(Date, DATEADD(YEAR, -4, GETDATE())) AS effective
       FROM   ks208.dbo.dmd
       INNER JOIN dmon208.dbo.dmhi
          ON dmd.rowno = dmhi.rowno_dmddmhi_dmd
     ) AS data_

   INNER JOIN ks208.dbo.dmd
       ON dmd.rowno = data_.rowno_dmddmhi_dmd

   WHERE  YEAR(data_.effective) >= YEAR(GETDATE()) - 4

   GROUP  BY data_.rowno_dmddmhi_dmd
             , data_.effective
             , dmd.balance
   ),

    AllDays AS ( 
      SELECT  DATEADD(YEAR, -4, GETDATE()) AS [Date]
      UNION ALL
      SELECT   DATEADD(DAY, 1, [Date])
      FROM     AllDays
      WHERE    [Date] < GETDATE() 
   )

SELECT effective
       , rowno_dmddmhi_dmd
       , amount
       , balance
FROM dmhi_hist

UNION ALL

SELECT [Date] as effective 
       , dmd.rowno AS rowno_dmddmhi_dmd
       , ISNULL(dmhi_hist.amount, 0) AS amount
       , dmd.balance
FROM   AllDays 
CROSS JOIN KS208.dbo.dmd
LEFT OUTER JOIN dmhi_hist 
   ON AllDays.Date = dmhi_hist.effective 
   AND dmd.rowno = dmhi_hist.rowno_dmddmhi_dmd

OPTION (MAXRECURSION 0)
...