我正在尝试在表格中使用suma列,同时排除某些已将付费字段设置为true的记录。
我这样做:
SELECT SUM( cost ) AS total
FROM sales
WHERE passport = 'xxxxx'
AND paid <>1
表中充满了数据,我可以自己显示成本,也可以显示总成本。只需加入 并支付&lt;&gt; 1 是什么导致它失败。查询不会因此而失败,但返回的NULL非常无用。
这是我表的SQL
CREATE TABLE sales (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
uuid varchar(64) NOT NULL,
firstname varchar(64) NOT NULL DEFAULT '',
lastname varchar(64) NOT NULL DEFAULT '',
passport varchar(64) DEFAULT NULL,
product varchar(64) NOT NULL,
quantity int(11) DEFAULT NULL,
cost double DEFAULT NULL,
paymenttype varchar(64) NOT NULL DEFAULT '',
paid tinyint(1) DEFAULT NULL,
tabno varchar(64) NOT NULL,
createdby int(10) unsigned DEFAULT NULL,
creationdate datetime DEFAULT NULL,
modifiedby int(10) unsigned DEFAULT NULL,
modifieddate timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
)
当前数据
INSERT INTO sales (id, uuid, firstname, lastname, passport, product, quantity, cost, paymenttype, paid, tabno, createdby, creationdate, modifiedby, modifieddate) VALUES
(20, ':8dcee958-d1ac-6791-6253-0a7344054295', 'Jason', 'Hoff', 'r454545', 'Nicaraguan nachoes', 4, 320, 'credit', 1, '23434', 2, '2010-07-06 04:10:18', 2, '2010-07-06 04:10:18'),
(19, ':3f03cda5-21bf-9d8c-5eaa-664eb2d4f5a6', 'Jason', 'Hoff', 'r454545', 'Nica Libre (doble 4 o 5 anos)', 1, 30, 'cash', NULL, '35', 2, '2010-07-06 03:35:35', 2, '2010-07-06 03:35:35'),
(18, ':f83da33b-2238-94b9-897c-debed0c3815e', 'Jason', 'Hoff', 'r454545', 'Helado con salsa de chocolate', 1, 40, 'cash', 1, '2', 2, '2010-07-05 21:30:58', 2, '2010-07-05 21:30:58');
答案 0 :(得分:2)
该行的'paid'值为NULL。你需要做
SELECT SUM( cost ) AS total
FROM test.sales
WHERE passport = 'r454545'
AND paid IS NULL or paid = 0
/*Or paid <> 1 as I see you are using tinyint datatype*/
或者,最好不要在该列中允许NULLS并将默认值设为0。
答案 1 :(得分:1)
您的问题是您的情况与任何行都不匹配。
条件paid <> 1
与paid
为NULL
的行不匹配。
尝试此查询:SELECT 1 <> NULL
它将返回NULL
。 WHERE
子句筛选出子句为false或NULL
的行。
将AND paid <> 1
替换为AND (paid IS NULL OR paid <> 1)
答案 2 :(得分:1)
本书SQL Antipatterns详细介绍了此问题,搜索可空列部分。强烈推荐的书。
答案 3 :(得分:0)
这可能意味着表格中没有付费&lt;&gt;的行或者可能有,但它们的成本为NULL。
答案 4 :(得分:0)
我不会使用“&lt;&gt;”,而是使用“!=”代替;
SELECT SUM( cost ) AS total FROM sales WHERE passport = 'xxxxx' AND paid != 1
如果这不起作用,您可以发布表定义吗?还有没有付费的记录= 1?
答案 5 :(得分:0)
SELECT SUM( cost ) AS total
FROM sales
WHERE passport = 'xxxxx'
AND paid = false or paid is null
EDITED
使用
IS NOT
而不是
!=
这应该有效
SELECT SUM( cost ) AS total
FROM sales
WHERE passport = 'xxxxx'
AND paid IS NOT true