使用 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]")
Here is my output and desired format, however I would like to improve my PctMiss accuracy:
这是一种已知的 SQL 服务器情况,如果在表达式中使用整数列,则必须 converted to decimals 您可以通过在表达式中使用至少一个十进制值来隐式地这样做,或者通过使用CAST
或 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(*))
我正在尝试使用 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]")
Here is my output and desired format, however I would like to improve my PctMiss accuracy:
这是一种已知的 SQL 服务器情况,如果在表达式中使用整数列,则必须 converted to decimals 您可以通过在表达式中使用至少一个十进制值来隐式地这样做,或者通过使用CAST
或 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(*))