2016-08-30 2 views
1

Предполагая, что я получил таблицу, как это:Count функция на группе по запросу

TransActions(Id, ArticleId, DateBought, DateSold) 

DateSold может быть пустым, если эта сделка не была продана еще. Для каждой статьи я хочу перечислить, сколько транзакций было куплено и продано до сих пор. Проблема в том, что GROUP BY не подходит для моего дела. Запрос я пробовал:

SELECT `ArticleId`, count(!ISNULL(DateBought)) AS `Bought`, count(!ISNULL(DateSold)) AS `Sold` 
FROM `Transactions` AS `Transactions` 
GROUP BY `Transactions`.`ArticleId`; 

Проблема с выше запроса:

Он всегда будет возвращать количество строк, сгруппированных по ArticleID. Так что, хотя у меня есть 22x DateSold = Null, он вернет 22 как Sold. Вот скриншот исходной таблицы для вышеупомянутой упрощенной задачи. ArticleID фактически TradeSettingId:

enter image description here

ответ

2

count возвращает число значений выражения переданных ему , что не нулевой. По вашему запросу каждое значение равно true или false - то есть не null, поэтому все строки подсчитываются. Чтобы сделать длинную историю короткой, нужно просто посчитать даты себя, и оставить тяжелую для count:

SELECT `ArticleId`, 
     COUNT(`DateBought`) AS `Bought`, 
     COUNT(`DateSold`) AS `Sold` 
FROM  `Transactions` AS `Transactions` 
GROUP BY `Transactions`.`ArticleId`; 
0

Вы можете добавить ИНЕКЕ с условием -

ГДЕ DateBought НЕ NULL ИЛИ DateSold NOT NULL

+2

Это не решит мою проблему вообще .. – kentor

Смежные вопросы