在Where语句中使用>,<或<>时,除以零错误。不涉及部门经营者

时间:2019-07-30 18:11:41

标签: sql sql-server

我有两个使用相同收据的表的CTE。收据类型“ a”表示要收取多少费用,是否可以收到一定金额。如果收据类型“ b”是在原始收据之外收到的,则有多少。这些由mnth,cusnbr和job匹配。收据上还分配了多少用于不同费用的收据。

如果收据已至少支付了99%,我将尝试总计工作时间。这些记录也基于cusnbr,jobnbr和mnth。下面的代码可以正常工作。

with billed as(Select cusnbr 
,job
,mnth
,sum(bill_item_1) as 'Billed Item'
,sum(billed) as 'Billed'
From accounting
Where mytype in ('a','b')
Group by cusnbr
,job
,mnth)

paid as(Select cusnbr 
,job
,mnth
,sum(rcpt_item_1) as 'Rcpt Item'
,sum(billed) as 'Paid'
From accounting
Where mytype in ('a','b')
Group by cusnbr
,job
,mnth)


Select b.cusnbr
,b.job
,b.mnth
,sum(g.hours) as 'Total Hours'
,b.[Billed Item]
,p.[Rcpt Item]
From billed b inner join paid p
on b.cusnbr = p.cusnbr
and b.job = p.job
and b.mnth = p.mnth
inner join guys g
on b.cusnbr = g.cusnbr
and b.job = g.job
and b.mnth = g.mnth
Where p.[Paid]/b.Billed > .99

我遇到的问题是,如果我尝试添加

and b.[Billed Item] <> 0

到where子句。

我得到“遇到零除错误”

我尝试使用

将最后一个查询设为CTE
case when b.[Billed Item] = 0 then 1 else 0 end as flag

,然后进行另一个查询以检查该标志<> 0 我尝试在上一个查询中使用isull(b。[Billed Item],0)以及在第一个CTE中使用isull(bill_item_1,0)。

我可以通过将整个内容转储到临时表中并对其进行查询来解决此问题,但只想知道为什么会这样。对b。[Billed Item]使用“>”,“ <”或“ <>”会导致除以零误差。

2 个答案:

答案 0 :(得分:6)

使用nullif()

Where p.[Paid] / nullif(b.Billed, 0) > 0.99

这将返回null -不符合条件。您也可以将其简单地表达为:

where p.paid > b.billed * 0.99

答案 1 :(得分:0)

我无法具体回答您的问题,但是我可以告诉您,SQL不需要处理所有命令。例如,

# Readings Class/Model
class Reading(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    time = db.Column(db.DateTime)
    name = db.Column(db.String(100))
    value = db.Column(db.Float)

    def __init__(self, time, name, value):
        self.time = time
        self.name = name
        self.value = value

# Reading Schema
class ReadingSchema(ma.Schema):
    class Meta:
        fields = ('time', 'name', 'value')

# Init Schema
reading_schema = ReadingSchema(strict=True)
readings_schema = ReadingSchema(many=True, strict=True)

# Create a Reading
@app.route('/reading', methods=['POST'])
def add_reading():
    time = request.json['time']
    name = request.json['name']
    value = request.json['value']

    new_reading = Reading(time, name, value)

    db.session.add(new_reading)
    db.session.commit()

    return reading_schema.jsonify(new_reading)

很高兴返回1。因此条件的顺序很有可能导致优化器过滤掉不必要的除以零的条件。