我有一个非常简单的问题,产生错误。示例将清除这一个。
library(odbc)
library(DBI)
library(dplyr)
library(dbplyr)
con <- dbConnect(odbc(), "myDSN")
tbl_test <- tibble(ID = c("A", "A", "A", "B", "B", "B"),
val = c(1, 2, 3, 4, 5, 6),
cond = c("H", "H", "A", "A", "A", "H"))
dbWriteTable(con, "tbl_test", tbl_test, overwrite = TRUE)
在向DB写入简单表之后,我在db中添加了指向表的链接,并尝试使用正常工作的简单条件求和。但是会遇到错误。
db_tbl <- tbl(con, in_schema("dbo", "tbl_test"))
db_tbl %>%
group_by(ID) %>%
summarise(sum = sum(val, na.rm = TRUE),
count_cond = sum(cond == "H", na.rm=TRUE),
sum_cond = sum(val == "H", na.rm=TRUE))
Error: <SQL> 'SELECT TOP 10 "ID", SUM("val") AS "sum", SUM(CONVERT(BIT, IIF("cond" = 'H', 1.0, 0.0))) AS "count_cond", SUM(CONVERT(BIT, IIF("val" = 'H', 1.0, 0.0))) AS "sum_cond"
FROM dbo.tbl_test
GROUP BY "ID"'
nanodbc/nanodbc.cpp:1587: 42000: [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Operand data type bit is invalid for sum operator.
我不是专家,但感觉SQL无法理解为1,因此无法计算总和。周围有没有,因为很多时候我都面临某种条件。下面是正常tibble的代码,表明它们应该可以工作。
tbl_test %>%
group_by(ID) %>%
summarise(sum = sum(val),
count_cond = sum(cond == "H"),
sum_cond = sum(val[cond == "H"]))
# A tibble: 2 x 4
ID sum count_cond sum_cond
<chr> <dbl> <int> <dbl>
1 A 6. 2 3.
2 B 15. 1 6.
我理解这可能不是可重复的示例,因为不是每个人都有可用的DB连接。
答案 0 :(得分:2)
SQL服务器无法对布尔值求和(它不会强制TRUE
到1
)。
所以你必须手动转换它们,一种方法是使用ifelse
,你的代码就变成了:
db_tbl %>%
group_by(ID) %>%
summarise(sum = sum(val, na.rm=TRUE),
count_cond = sum(ifelse(cond == "H",1,0),na.rm=TRUE),
sum_cond = sum(ifelse(cond == "H",val,0),na.rm=TRUE))