sql统计错误:select b.son_org_name sonOrgName,ifnull(count(CASE WHEN b.bridgeGrade = '一类' THEN 1 ELSE 0 END), 0) yilei from base_bridge b LEFT JOIN base_bridge_evaluation e on e.bid = b.id where b.isNormal = '正常' GROUP BY b.sonOrgId
时间: 2024-02-12 18:09:10 浏览: 28
这条 SQL 语句的问题在于,在使用 LEFT JOIN 连接时,如果左表(base_bridge)中没有对应的记录,右表(base_bridge_evaluation)中对应的值将会是 NULL。在对这个 NULL 值进行 CASE WHEN 判断时,会得到 NULL 值,而不是 0 或 1,因此最终的 count() 函数计算结果会出现错误。解决这个问题的方法是使用 IFNULL() 函数,将 NULL 值转换为 0 或 1。正确的 SQL 语句应该是:
```
SELECT
b.son_org_name AS sonOrgName,
IFNULL(COUNT(CASE WHEN b.bridgeGrade = '一类' THEN 1 ELSE NULL END), 0) AS yilei
FROM
base_bridge b
LEFT JOIN base_bridge_evaluation e ON e.bid = b.id
WHERE
b.isNormal = '正常'
GROUP BY
b.sonOrgId
```
相关问题
ifnull(sum(CASE WHEN b.stmt_status = 1 THEN b.stmt_amt ELSE 0 END) ,0 ) as unpaid_amt,
非常抱歉,我之前的回答有误。对于你提供的代码,如果要使用IFNULL函数处理空值,可以将其放在sum函数的外面。以下是修正后的代码示例:
```sql
SELECT
IFNULL(sum(CASE WHEN b.stmt_status = 1 THEN b.stmt_amt ELSE 0 END), 0) as unpaid_amt,
...
FROM
...
```
在这个修正后的代码中,`IFNULL`函数用于处理`sum(CASE WHEN b.stmt_status = 1 THEN b.stmt_amt ELSE 0 END)`的结果。如果结果为`NULL`,则替换为0。最后的结果将被命名为`unpaid_amt`。
请注意,上述解释仅基于提供的代码片段,具体的查询语句和数据表结构可能会有所不同。
`ifnull(sum(CASE WHEN b.stmt_status = 1 THEN b.stmt_amt ELSE 0 END) 0 ) as unpaid_amt, `
这段代码中存在一处错误。正确的语法应该是在IFNULL函数的两个参数之间添加逗号。以下是修正后的代码示例:
```sql
SELECT
IFNULL(sum(CASE WHEN b.stmt_status = 1 THEN b.stmt_amt ELSE 0 END), 0) as unpaid_amt,
...
FROM
...
```
在这个修正后的代码中,`IFNULL`函数用于处理`sum(CASE WHEN b.stmt_status = 1 THEN b.stmt_amt ELSE 0 END)`的结果。如果结果为`NULL`,则替换为0。最后的结果将被命名为`unpaid_amt`。
请注意,上述解释仅基于提供的代码片段,具体的查询语句和数据表结构可能会有所不同。