Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite IFNULL不';在公式中不起作用_Sqlite_Isnull - Fatal编程技术网

SQLite IFNULL不';在公式中不起作用

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

有时,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 
      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;