2015-12-12 7 views
1

Это ломает голову. Я прочесываю интернет (включая это место) и не могу найти решение. Поэтому, в крайнем случае, я надеялся, что хорошие люди этого форума смогут мне помочь.MYSQL - COUNT() NULL Значения

У меня есть две таблицы:

TableA 
Order_detailsID 
OrderID 
TitleID 
Return_date 

TableB 
TitleID 
Title_name 
Quantity_in_stock 

И хотел бы выполнить запрос, который показывает оставшееся «Quantity_in_stock».

Если для параметра «Return_date» установлено значение NULL, это означает, что элемент в данный момент отсутствует, поэтому я пытаюсь использовать функцию count() для значений NULL и вычитать ее из «Quantity_in_stock».

Это сценарий, я до сих пор:

DELIMITER // 
CREATE PROCEDURE InStock() 
BEGIN 

Select TableB.TitleID, 
TableB.Title_name, 
TableB.Quantity_in_stock AS 'Total_Stock', 
COUNT(TableA.return_date IS NULL) AS 'Rented_Out', 
TableB.Quantity_in_stock - COUNT(TableA.return_date IS NULL) AS 'Remaining Stock' 
From TableB 
LEFT JOIN TableA 
ON TableA.TitleID = TableB.TitleID 
GROUP BY TableB.TitleID; 

END// 

Это работает, если есть один из нескольких TitleIDs в NULL, однако, если нет значения в NULL, то Count() по-прежнему возвращая значение 1, когда оно должно быть 0.

Что я делаю неправильно?

ответ

0

Вместо:

COUNT(TableA.return_date IS NULL) 

используют это:

SUM(CASE 
     WHEN TableA.TitleID IS NULL THEN 0 
     WHEN TableA.return_date IS NOT NULL THEN 0 
     ELSE 1 
     END) 

Проблема с TableA.return_date IS NULL предиката является то, что это не правда, в двух совершенно различных ситуациях:

  1. Когда нет соответствующая запись в TableA
  2. Когда есть соответствующая запись, но TableA.return_date значение этой точной записи - NULL.

Используя выражение CASE, вы можете различать эти два случая.

+0

Благодарим за быстрый ответ. Это работает с идентификаторами TitleID, которые вообще не отображаются в TableA. Однако идентификаторы TitleID, которые появляются в TableA, но имеют не-NULL return_date (дата), все еще подсчитываются. Я хочу только вычесть значения NULL из количества. – Gary866

+0

@ Gary866 Пожалуйста, проверьте внесенные изменения. –

+0

Еще раз оцените помощь, но я боюсь, что у меня все еще возникают две проблемы: 1) Если TitleID вообще не отображается в TableA, он все равно подсчитывает его один раз и вычитает 1 из TableB.Quantity_in_stock. 2) Если TitleID появляется в таблице A с не-NULL return_date, то он также подсчитывает их. – Gary866

0

Я хотел бы упомянуть простую концепцию здесь, просто продолжайте считать строки, когда этот конкретный столбец - null.

select count(*) from table_name where column_name is null 
Смежные вопросы