SQLite IFNULL不';在公式中不起作用
有时,SUM(c.Quantity)为null,因此我需要将其转换为0,尝试使用case/isnull等等,但在这个公式中不起作用SQLite IFNULL不';在公式中不起作用,sqlite,isnull,Sqlite,Isnull,有时,SUM(c.Quantity)为null,因此我需要将其转换为0,尝试使用case/isnull等等,但在这个公式中不起作用 SELECT (t.LastMonthBalance + IFNULL(SUM(c.Quantity), 0) - t.Balance) * 100.0 / (t.EndMileage - t.StartMileage) AS Result FROM TripSheet AS t, Cheque AS c WHERE t.VehicleId = 8
SELECT (t.LastMonthBalance + IFNULL(SUM(c.Quantity), 0) - t.Balance) * 100.0 / (t.EndMileage - t.StartMileage) AS Result
FROM TripSheet AS t, Cheque AS c
WHERE t.VehicleId = 8
AND t.Date = '2018-05'
AND c.VehicleId = 8
AND c.Date BETWEEN '2018-05-01' AND '2018-05-31';
我相信您的问题不在于
ifnull
,而在于其他值为null
e、 g.运行(数量为空):-
结果150.0
使用额外的支票条目运行:-
INSERT INTO Cheque VALUES(8,'2018-05-03',25.00);
结果175.0
但是,如果其他值为null,如LastMonthBalance,则结果将为null
所以,也许你想要这样的东西:-
SELECT (IFNULL(t.LastMonthBalance,0) + IFNULL(SUM(c.Quantity), 0) - IFNULL(t.Balance,0)) * 100.0 / IFNULL((t.EndMileage - t.StartMileage),100) AS Result
在这种情况下:-
DROP TABLE IF EXISTS Tripsheet;
DROP TABLE IF EXISTS Cheque;
CREATE TABLE If NOT EXISTS Tripsheet (VehicleId INTEGER, DATE TEXT, Balance REAL, EndMileage INTEGER, StartMileage , LastMonthBalance REAL);
CREATE TABLE IF NOT EXISTS Cheque (Vehicleid INTEGER, date TEXT, Quantity REAL);
INSERT INTO Tripsheet VALUES(8,'2018-05',null,null,null,null);
INSERT INTO Cheque VALUES(8,'2018-05-02',null);
SELECT (IFNULL(t.LastMonthBalance,0) + IFNULL(SUM(c.Quantity), 0) - IFNULL(t.Balance,0)) * 100.0 / IFNULL((t.EndMileage - t.StartMileage),100) AS Result
FROM TripSheet AS t, Cheque AS c
WHERE t.VehicleId = 8
AND t.Date = '2018-05'
AND c.VehicleId = 8
AND c.Date BETWEEN '2018-05-01' AND '2018-05-31';
结果为0.0,而不是原始SQL生成的null。是,其他值为null。但要解决这个问题,我必须使用左JOIN和groupby子句更改查询解决方案:
SELECT (t.LastMonthBalance + IFNULL(SUM(c.Quantity), 0.0) - t.Balance) * 100 / (t.EndMileage - t.StartMileage) AS Result
FROM TripSheet AS t LEFT JOIN Cheque as c ON t.VehicleId = c.VehicleId
WHERE t.Date = '2018-05' AND t.VehicleId = 1
GROUP BY t.VehicleId;
谢谢卢卡斯和米凯特 这个查询有更多的问题,比如:交叉连接和没有GROUPBY子句
IFNULL
可以替换为COALESCE
。定义“不工作”。您运行查询的是什么数据,得到了什么结果,您期望得到什么结果。@juharr如果SUM(c.Quantity)有值,它就可以正常工作,但如果表i中没有值,则总体计算结果为null。因为我假设它没有将0识别为公式中的值。表中没有值吗?那么你希望t.LastMonthBalance是什么呢?例如,juharr需要一个月公式(100+100{is sum(c.Quantity)}-50)*100/(200-100)=150。如果该月总和(c.数量)没有值,则应为0,结果应为50。但在我的情况下,sql抛出空值而不是50
SELECT (t.LastMonthBalance + IFNULL(SUM(c.Quantity), 0.0) - t.Balance) * 100 / (t.EndMileage - t.StartMileage) AS Result
FROM TripSheet AS t LEFT JOIN Cheque as c ON t.VehicleId = c.VehicleId
WHERE t.Date = '2018-05' AND t.VehicleId = 1
GROUP BY t.VehicleId;