2010-07-06 3 views
0

Я пытаюсь сума столбца в таблице, исключая определенные записи, у которых плавающее поле установлено в true.Суммирование поля, исключая определенные поля в SQL

Я делаю так, как это:

SELECT SUM(cost) AS total 
FROM sales 
WHERE passport = 'xxxxx' 
AND paid <>1 

таблица полна данных, и я могу отобразить затраты самого по себе, или всему объему. Просто добавив И оплатил <> 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

У вас есть запись, соответствующая 'WHERE passport = 'xxxxx' И платная <> 1' –

+0

У меня 3 записи, номер паспорта один и тот же для всех из них, а платный - только для 2 из них. – 2010-07-06 10:20:07

+1

Вы уже задали [тот же вопрос] (http://stackoverflow.com/questions/3184872/excluding-certain-fields-from-an-sql-sum-query) и приняли ответ. Вы должны отредактировать этот вопрос, если это необходимо, вместо того, чтобы начинать новый. – Mike

ответ

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 
+0

Хмм, это все еще возвращает NULL. Я редактировал свой вопрос, чтобы показать содержимое таблицы. – 2010-07-06 10:28:40

+0

@Jacob: - потому что во всех ваших платных данных установлено значение TRUE – Salil

+0

Salil, средняя запись заплатила установленную значение NULL. – 2010-07-06 10:36:44

0

Это может означать, что нет ни одной строки в таблице, за которые заплатили <> 1. Или, может быть, есть но они стоят NULL.

+0

. Никакие затраты не равны нулю, и есть записи, в которых уплаченные не установлены. – 2010-07-06 10:34:40

+0

У вас нет паспорта «xxxxx». Предположительно, это была не реальная ценность? Кроме того, у вас есть NULL в платной колонке. Это может привести к проблемам, если вы планируете использовать его как логический тип. –

0

Я бы не использовал «<>», но вместо этого используйте «! =»;

 
SELECT SUM(cost) AS total 
FROM sales 
WHERE passport = 'xxxxx' 
AND paid != 1 

Если это не сработает, можете ли вы опубликовать определение таблицы? И есть ли записи, которые не заплатили = 1?

+0

Да, есть одна запись, где платный не установлен на один. Используя вышеизложенное, возвращается только NULL. – 2010-07-06 10:28:11

+0

'<>' является стандартным SQL. '! =' поддерживается некоторыми, но далеко не всеми, базами данных и не является стандартным. – psmears

2

«Платное» значение для этой строки равно 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*/ 

Или, лучше было бы, чтобы не допустить провалов в этой колонке и заплатили по умолчанию 0.

1

Ваша проблема заключается в том, что ваше состояние не соответствует ни одной строки.

Условие paid <> 1 не соответствует строке, где paid является NULL.

Попробуйте этот запрос: SELECT 1 <> NULL Он вернет NULL. Статья WHERE отфильтровывает строки, в которых предложение является либо ложным, либо NULL.

Заменить AND paid <> 1 с AND (paid IS NULL OR paid <> 1)

1

Книга SQL Antipatterns описывает эту проблему в деталях, раздел поискового NULLABLE Колонны. Настоятельно рекомендуемая книга.