2016-08-04 5 views
1

의 쿼리에 전달 저는 반짝이는 반짝이는 대시 보드를 사용하고 SQL 데이터베이스 인 SQL-SERVER를 사용하여 데이터베이스에서 직접 데이터를 가져오고 싶습니다. 본질적으로 아이디어는 날짜 범위에 대한 시작 지점과 중단 지점이있는 테이블의 열에 병합하고 표로 만든 다음 다이어그램으로 구성하는 것입니다. SQL 입력 날짜 범위를 SHINY

나는 반짝에 SQL 입력 문을 통과하는 방법에 대한 다음과 같은 게시물을 발견 : 나는 시도 불행하게도 때 How to pass input variable to SQL statement in R shiny?

내가 오류 '첨자가 범위를 벗어 받기를 적용을; 쿼리를 가져 오지 않은 것처럼 보입니다. 별도로 테스트 했으므로 데이터를 가져 와서 문제없이 각 단계를 실행할 수있었습니다. 이것이 문제인지 궁금한 RODBC 패키지를 사용하고 있습니다.

  library(stringr) 
     library(RODBC) 
      library(circlize) 
     library(shinydashboard) 
     library(shiny) 

       ui <- dashboardPage(skin = "blue", 
       dashboardHeader(title = "sample"), 
       dashboardSidebar(disable = TRUE), 
       dashboardBody(
        # Boxes need to be put in a row (or column) 
        fluidRow(
        box(title = "Route Volume", background = "green", solidHeader = TRUE, 
         plotOutput(outputId= 'plot2'))), 
        fluidRow( 
         box(background= "green", dateRangeInput("dates", label = h3("Date Range"),start = '2016-06-01', 
                   end = '2016-06-05')), width = 4 

        )))) 

       server <- function(input, output) { 
      database = odbcConnect("datatbase") 
      output$plot2 = renderPlot({ 

      d = paste0("SELECT 
       top 30 
      convert(char(10),datetime,121) as date, 
      cast(start_destination as varchar(3)) 
      + (',') + cast(final_destination as varchar(3)) as combo, 
      count(cast(start_destination as varchar(3)) 
      + (',') + cast(final_destination as varchar(3))) as volume 
      FROM 
      trips 
      WHERE datetime >= ",input$dates[1]," AND 
      datetime < ",input$dates[2]," 
      GROUP BY 
      cast(start_destination as varchar(3)) 
      + (',') + cast(final_destination as varchar(3)), 
      convert(char(10),datetime,121);") 

     sql = sqlQuery(database, d) 

      sql = data.frame(sql, do.call(rbind, str_split(sql$combo, ','))) 
     colnames(sql)[colnames(sql)=="X1"] <- "From" 
     colnames(sql)[colnames(sql)=="X2"] <- "To" 
     sql = sql[,c(4,5,3)] 
     sql = sql[order(sql$volume, decreasing = T),] 
      chordDiagram(sql) 
      circos.clear() 

      }) 

      } 


      shinyApp(ui, server) 

난이 바보 같은 실수, 누락 된 인용 부호 또는 이러한 기술을 적용하는 방법의 나의 부분에 오해 확신 : 다음은 내 코드입니다. 도움을 감사하십시오 !!

   ##adding edits by Dean to test 



       database = odbcConnect("database") 
      output$plot2 = renderPlot({ 
       if(input$dates[1]!= "") { 
       d = paste0("SELECT 
      top 30 
      convert(char(10),datetime,121) as date, 
      cast(start_destination as varchar(3)) 
      + (',') + cast(final_destination as varchar(3)) as combo, 
      count(cast(start_destination as varchar(3)) 
      + (',') + cast(final_destination as varchar(3))) as volume 
      FROM 
      trips 
      WHERE 
      datetime >= ",input$dates[1]," AND 
      datetime < ",input$dates[2]," 
      GROUP BY 
      cast(start_destination as varchar(3)) 
      + (',') + cast(final_destination as varchar(3)), 
      convert(char(10),datetime,121);") 
     sql = sqlQuery(database, d) 

     #i assumed the if statement ended here so I put the 
     #bracket below 
      sql = data.frame(sql, do.call(rbind, str_split(sql$combo, ','))) 
     colnames(sql)[colnames(sql)=="X1"] <- "From" 
     colnames(sql)[colnames(sql)=="X2"] <- "To" 
     sql = sql[,c(4,5,3)] 
     sql = sql[order(sql$volume, decreasing = T),] 
      chordDiagram(sql) 
      circos.clear() 

} 
    }) 

    } 

는 NJburgo 에 의해 제안 다음 서버에 편집을 두는 ################################ ## NJburgo 제안 ################ 오류를 얻을 #I : 나는 그렇지

     database = odbcConnect("database") 
          output$plot2 = renderPlot({ 
          dates = as.Date(input$dates) 
          d = paste0("SELECT 
         top 30 
         convert(char(10),datetime,121) as date, 
        cast(start_destination as varchar(3)) 
         + (',') + cast(final_destination as varchar(3)) as combo, 
         count(cast(start_destination as varchar(3)) 
        + (',') + cast(final_destination as varchar(3))) as volume 
        FROM 
        trips 
         WHERE 
         datetime >= {d '",input$dates[1],"'} AND 
         datetime < {d '",input$dates[2],"'} 
         GROUP BY 
         cast(start_destination as varchar(3)) 
         + (',') + cast(final_destination as varchar(3)), 
         convert(char(10),datetime,121);") 
        sql = sqlQuery(database, d) 


        sql = data.frame(sql, do.call(rbind, str_split(sql$combo, ','))) 
       colnames(sql)[colnames(sql)=="X1"] <- "From" 
       colnames(sql)[colnames(sql)=="X2"] <- "To" 
       sql = sql[,c(4,5,3)] 
       sql = sql[order(sql$volume, decreasing = T),] 
       chordDiagram(sql) 
        circos.clear() 

       }) 

      } 
+2

SQL 쿼리를 생성하기 위해 문자열 연결을 사용하는 것은 버그 자체입니다. 예기치 않은 날짜 및 숫자 매개 변수의 변환은 발생할 수있는 문제 중 하나 일뿐입니다. 모든 인용, 형식 및 보안 문제를 피하려면 적절한 [매개 변수화 된 쿼리] (https://cran.r-project.org/web/packages/RODBCext/vignettes/Parameterized_SQL_queries.html)를 사용하십시오 –

+0

shiny는 SQL을 실행하고 있습니다. '입력 $ dates'에 값이 들어 오기 전에. sql 쿼리가 발생하기 전에 print (input $ dates [1])와 print (input $ dates [2])를 넣고 app을 실행합니다. 여기서는 Rstudio에서 실행 중이므로 Rstudio 창에서 인쇄 내용을 볼 수 있습니다. –

+0

안녕 딘. 나는 입력 된 $ 날짜를 인쇄하려고했지만 아무런 효과가 없었다. 날짜가 하드 코드 된 경우 데이터가 문제없이 처리되므로 문제가 발생했는지 확인하십시오. – LoF10

답변

-1

클래스 날짜 입력 $ 날짜를 변환하는 방법을 몰라 당신의 질문이 반짝 반짝 빛나는 바깥의 평범한 날짜와 함께 작동한다면, R, 더 가능성있는 SQL이라고 생각하십시오 (힌트 : 이것을 테스트 해보고 다시보고하십시오!).

format(Sys.Date(), "{d '%Y-%m-%d'}") 
:

...WHERE col_name >= {d '2016-08-04'}... 

그래서 당신은 R.의 날짜에게이 작업을 수행하는 가장 간단한 방법을 포맷 할 필요는 형식입니다 : SQL에서 날짜 비교를 위해

는 항상 그렇게 날짜를 변환 할 수 있었다
+2

문자열 연결을 피하고 매개 변수화 된 쿼리를 사용하면 날짜를 변환하지 않아도됩니다. * 사용하는 * 경우, 명확한 날짜 형식은 구분되지 않은 형식, 즉 '20160804'입니다. 어떤 경우에도 [매개 변수가있는 쿼리] (https://cran.r-project.org/web/packages/RODBCext/vignettes/Parameterized_SQL_queries.html)를 지원하는 RODBCext를 사용하는 것이 훨씬 쉽고 안전합니다. –

+0

유용한 팁! 감사. 팁 녀석 덕분에 – NJBurgo

+0

감사합니다. Panagiotos, 필자는 매개 변수화 된 쿼리가 이후에 이동할 필요가있는 부분이 분명하다고 생각하지만 문제가 확실하지 않습니다. 질의는 빛나는 곳 바깥에서 벌금을 부리며 빛나는 곳에서 멈 춥니 다. 나는 앞서 가서 데이터를 날짜 형식으로 변환하고 여전히 성공하지 못했음을 확인하기 위해 col_name> = {d ' ", 입력 $ dates [1],"}} NJBurgo를 사용하여 솔루션을 시도했습니다. 빛나는의). 나는 열심히 쿼리에 날짜가 잘 작동 할 때주의를 기울였다. 그래서 문제는 입력 $ 날짜가 있다고 생각합니다. 확실하지 않은 곳. 어떤 아이디어? – LoF10

0
########## 대답을 알아 냈습니다. 여러분 모두의 제안과 함께 날짜를 인쇄하여 변환해야했습니다. 아래 코드는 작동합니다.
   server <- function(input, output) { 

      output$plot2 = renderPlot({ 
      database = odbcConnect("database") 
       start_date = print(input$dates[1]) 
       end_date = print(input$dates[2]) 
       my_query="SELECT 
       top 30 
         convert(char(10),datetime,121) as date, 
         cast(start_destination as varchar(3)) 
         + (',') + cast(final_destination as varchar(3)) as combo, 
          count(cast(start_destination as varchar(3)) 
          + (',') + cast(final_destination as varchar(3))) as volume 
          FROM 
          trips 
           WHERE 
          datetime >= DATE1 AND 
          datetime < DATE2 
          GROUP BY 
          cast(start_destination as varchar(3)) 
          + (',') + cast(final_destination as varchar(3)), 
          convert(char(10),datetime,121);" 

       my_query <- sub("DATE1",as.Date(start_date),my_query); 
       my_query <- sub("DATE2",as.Date(end_date),my_query) 
      sql = sqlQuery(database, paste(my_query)) 
      sql = data.frame(sql, do.call(rbind, str_split(sql$combo, ','))) 
      colnames(sql)[colnames(sql)=="X1"] <- "From" 
      colnames(sql)[colnames(sql)=="X2"] <- "To" 
      sql = sql[,c(4,5,3)] 
      sql = sql[order(sql$volume, decreasing = T),] 
      chordDiagram(sql) 
      circos.clear() 
       }) 


      } 


      shinyApp(ui, server) 
관련 문제