#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