簡體   English   中英

使用RODBC連接從R中的SQL查詢獲取精確的百分比

[英]Getting precise percentages from a SQL Query in R using the RODBC Connection

我正在嘗試使用RODBC包在R中創建一個函數,以循環遍歷SQL數據庫中的五個表,以查找每個變量每年的行數,每個變量每年的%null以及缺少的%每個變種每年 我在創建單個函數以提供此准確輸出方面遇到麻煩。 我創建了一個輸出總計數和null百分比的函數,但似乎無法使它直接產生准確的百分比缺失-它似乎是舍入為整數,而不是始終舍入或舍入。 下面是我的代碼。 任何幫助,將不勝感激。

PctNull <- sqlQuery(channel, "select 
                [EVENT_YEAR] AS 'YEAR', 
                COUNT(*) AS 'TOTAL',
                (((COUNT(CASE WHEN MOTHER_EDUCATION_TRENDABLE = -1 THEN 1 END))*100)/COUNT(*)) AS 'PctMiss',
                (((COUNT(*) - COUNT(MOTHER_EDUCATION_TRENDABLE))*100)/COUNT(*)) AS 'PctNull'


                from [GA_CMH].[dbo].[BIRTHS]

                GROUP BY [EVENT_YEAR]
                ORDER BY [EVENT_YEAR]")

這是我的輸出和所需的格式,但是我想提高PctMiss的准確性:

這是一種已知的SQL Server情況,其中必須將整數列(如果用於表達式中) 轉換為小數 ,您可以通過在表達式中使用至少一個十進制值或使用CASTCONVERT顯式地進行隱式CONVERT

對於隱式轉換,請將COUNT()值乘以100.00(帶有2個十進制值)或將整個值乘以1.00:

PctNull <- sqlQuery(channel, 
                    "SELECT [EVENT_YEAR] AS 'YEAR', 
                            COUNT(*) AS 'TOTAL',
                            (((COUNT(CASE WHEN MOTHER_EDUCATION_TRENDABLE = -1 
                                          THEN 1 
                                     END)) * 100.00) / COUNT(*)) AS 'PctMiss',
                            (((COUNT(*) - COUNT(MOTHER_EDUCATION_TRENDABLE)) * 100.00) /  
                               COUNT(*)) AS 'PctNull'
                     FROM [GA_CMH].[dbo].[BIRTHS]
                     GROUP BY [EVENT_YEAR]
                     ORDER BY [EVENT_YEAR]")

對於顯式轉換,請使用CAST專門聲明類型和精度:

(((CAST(COUNT(CASE WHEN MOTHER_EDUCATION_TRENDABLE = -1 
                   THEN 1 
              END)) * 100) AS DECIMAL(10,2)) / COUNT(*))

CONVERT

(((CONVERT(DECIMAL(10,2), COUNT(CASE WHEN MOTHER_EDUCATION_TRENDABLE = -1 
                                     THEN 1 
                                END)) * 100)) / COUNT(*))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM