mySQL计算提供不正确的数据

时间:2016-04-24 04:27:40

标签: mysql

我编写了以下查询并获得了良好的数据, 那么总租金减去折扣显示为净租金的正确方法是什么?我写的脚本给了我一个分支的空值,我知道这是不正确的?

SELECT branch_name, gross_hire_$, discount_$
FROM m_rental R, m_vehicle V, m_branch B
WHERE r.rego_no = v.rego_no
AND v.branch_code = b.branch_code
GROUP BY b.branch_code
ORDER BY branch_name

2 个答案:

答案 0 :(得分:0)

假设您的查询不会抛出不明确的列错误,这可能会对您有所帮助。如果您知道折扣可以为null,请在执行聚合时使用ifnull()。如果你正在做总和,那么你可以使用sum(ifnull(discount,0))但是如果你正在做平均值并且你想要非零记录的平均值那么你将不得不做这样的事情:

sum(case when discount is not null then discount else 0 end)/
sum(case when discount is not null then 1 else 0 end)

但在目前的情况下,以下情况应该可以解决。

select branch_name, sum(ifnull(gross_hire,0)) as gross_hire,
sum(ifnull(discount,0)) as discount from m_rental r, 
m_vehicle v, m_branch b  where r.rego_no = v.rego_no 
and v.brand_code = b.branch_code group by b.branch_code order by branch_name;

答案 1 :(得分:0)

您可以在SELECT的列列表中执行算术运算,并且只要您拥有可能 null 的列(并且您可以将 null 替换为某些非空值),您可以使用SQL COALESCE函数。

SELECT branch_name, gross_hire_$, discount_$, (gross_hire_$ - COALESCE(discount_$, 0)) AS net_hire_$
  FROM m_rental R, m_vehicle V, m_branch B
  WHERE r.rego_no = v.rego_no
    AND v.branch_code = b.branch_code
  GROUP BY b.branch_code
  ORDER BY branch_name

应该符合您的目的。致电COALESCE(discount_$, 0)会返回discount_$ 的值,除非它是 null ,在这种情况下,它会返回0

请注意,我没有尝试对任何列求和,但原则仍然存在。