SQL-запрос, не возвращающий ожидаемый результат

#mysql

#mysql

Вопрос:

Я написал следующий запрос, чтобы вернуть некоторую статистику о покупках, совершенных за X промежуток времени. Но по какой-то причине каждый столбец «COUNT» возвращает общее количество строк. Я неправильно организовал запрос?

 SELECT COUNT(*) as countTotal, SUM(`cost`) as cost, COUNT(`paymentType` = 'credit') as count_credit, COUNT(`paymentType` = 'cash') as count_cash 
FROM `purchase` WHERE `date` >= '2011-5-4'
  

Обновить

Я просто решил использовать вложенные запросы. Это то, с чем я закончил.

 SELECT 
COUNT(*) as countTotal,
SUM(`cost`) as cost, 
(SELECT COUNT(*) FROM `purchase` WHERE `paymentType` = 'credit') as count_credit, 
(SELECT COUNT(*) FROM `purchase` WHERE `paymentType` = 'cash') as count_cash 
FROM `purchase` WHERE `date` >= '2011-5-4'
  

update2

Использовал ответ ypercubes ниже.

Комментарии:

1. Я могу ошибаться здесь, но я не думаю, что вы можете использовать выражения, подобные paymentType = 'credit' в COUNT функции. Я думаю, вам нужно будет использовать подзапросы (или пользовательские функции) вместо этого.

2. Если бы у вас было 100 строк, удовлетворяющих критериям даты, и 50 из них были PaymentType=’credit’, вы ожидали бы результат, 100, X, 50 где X была сумма всех 100 строк? Или X была бы только сумма кредитных платежей?

3. Если бы у меня было 100 полных строк, 50 кредитов и 50 наличных, всего по 1 доллару каждая, я бы хотел сказать следующее: 100, 100, 50, 50

Ответ №1:

count возвращает количество строк для запрошенного домена или группы. Похоже, вам нужно сгруппировать по PaymentType, чтобы достичь того, что вы ищете.

 SELECT PaymentType, COUNT(*) as countTotal, SUM(`cost`) as cost, 
FROM `purchase` 
WHERE `date` >= '2011-5-4' 
Group by PaymentType
  

вот ссылка
http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

Ответ №2:

Это выглядит некорректно, но изменение COUNT() на SUM() работает нормально:

 SELECT COUNT(*) AS countTotal
     , SUM(cost) AS cost
     , SUM(paymentType = 'credit') AS count_credit   --- SUM does counting here
     , SUM(paymentType = 'cash') AS count_cash       --- and here
FROM purchase
WHERE `date` >= '2011-05-04'
  

Объяснение: True == 1 и False == 0 для MySQL.

Комментарии:

1. Бинго, это то, что я действительно искал. Спасибо вам ооочень большое. Чувак, @ypercube это второй раз, когда ты меня спас. Ты мужчина.

Ответ №3:

Вам нужно предложение GROUP BY после вашего предложения WHERE