SQL-запрос на статистику

12
EM
На сайте с 16.12.2005
Offline
108
1388

Здравствуйте,

помогите пожалуйста сформировать SQL-запрос.

Таблица такой структуры:

id | paymentType | paymentDate | paymentSumm

Данные:

1 | Webmoney | 03-11-2011 | 50

2 | Безнал-ый | 02-11-2011 | 100

3 | Webmoney | 01-11-2011 | 30

4 | Безнал-ый | 31-10-2011 | 20

5 | Webmoney | 01-10-2011 | 50

Нужно вывести помесячную статистику полученных платежей, общее количество платежей и сумму переведенных за текущий месяц по Webmoney денег.

Т.е. такое:

11-2011 | 3 | 80

10-2011 | 2 | 50

Пытаюсь сделать JOIN-ом, но не работает как надо. Подправьте меня, что не так:


SELECT
COUNT(s.id) AS payCount,
DATE_FORMAT(FROM_UNIXTIME(s.paymentDate),"%m-%Y") AS dateDiff,
SUM(p.paymentSumm) AS paySumm
FROM
paymentslist s
LEFT JOIN
paymentslist p
ON
DATE_FORMAT(FROM_UNIXTIME(s.paymentDate),"%m-%Y")=DATE_FORMAT(FROM_UNIXTIME(p.paymentDate),"%m-%Y")
AND
p.paymentType="Webmoney"
GROUP BY
dateDiff
ORDER BY
s.paymentDate
DESC
LEOnidUKG
На сайте с 25.11.2006
Offline
1764
#1

COUNT() и SUM()

Вам ни о чём не говорит? Есть такие полезные функции... их даже в запрос можно вставлять.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
EM
На сайте с 16.12.2005
Offline
108
#2
LEOnidUKG:
COUNT() и SUM()

Вам ни о чём не говорит? Есть такие полезные функции... их даже в запрос можно вставлять.

Простите, но не могу сообразить. Если правильно понял, вы предлагаете делать подзапрос? Вроде: COUNT( (SELECT * ...) )?

e_moon добавил 28.11.2011 в 13:52

e_moon:
Простите, но не могу сообразить. Если правильно понял, вы предлагаете делать подзапрос? Вроде: COUNT( (SELECT * ...) )?

SUM(s.paymentType="Webmoney") AS paySumm

Спасибо огромное, кажется направили в нужное русло!

LEOnidUKG
На сайте с 25.11.2006
Offline
1764
#3
EM
На сайте с 16.12.2005
Offline
108
#4

И все-таки не получается как надо.

SUM(s.paymentType="Webmoney") возвращает количество строк, где платеж шел по Webmoney, но не сумму поступивших средств!


SELECT
COUNT(id) AS payCount,
DATE_FORMAT(FROM_UNIXTIME(paymentDate),"%m-%Y") AS dateDiff,
SUM(paymentType="Webmoney") AS paySumm
FROM
paymentslist
GROUP BY
dateDiff
ORDER BY
paymentDate
DESC
C
На сайте с 04.02.2005
Offline
291
#5

а может нужен paymentSumm?

Chukcha добавил 28.11.2011 в 14:53

и goup by делать не только поdateDiff , но и по платежной системе

EM
На сайте с 16.12.2005
Offline
108
#6
Chukcha:
а может нужен paymentSumm?

Chukcha добавил 28.11.2011 в 14:53
и goup by делать не только поdateDiff , но и по платежной системе

Да, нужен SUMM(paymentSumm), но только где paymentType="Webmoney".

А GROUP BY же как? В течение месяца идет по нескольку платежей через один из способов оплаты!?.

Короче говоря, прихожу к тому что надо все-таки делать в два запроса.

edogs software
На сайте с 15.12.2005
Offline
775
#7
e_moon:
И все-таки не получается как надо.

SUM(s.paymentType="Webmoney") возвращает количество строк, где платеж шел по Webmoney, но не сумму поступивших средств!


SELECT
COUNT(id) AS payCount,
DATE_FORMAT(FROM_UNIXTIME(paymentDate),"%m-%Y") AS dateDiff,
SUM(paymentType="Webmoney") AS paySumm
FROM
paymentslist
GROUP BY
dateDiff
ORDER BY
paymentDate
DESC

sum(if(s.paymentType='Webmoney',paymentSumm,0))

edogs добавил 28.11.2011 в 15:20

e_moon:
Да, нужен SUMM(paymentSumm), но только где paymentType="Webmoney".

А GROUP BY же как? В течение месяца идет по нескольку платежей через один из способов оплаты!?.

Короче говоря, прихожу к тому что надо все-таки делать в два запроса.

group by dateDiff , s.paymentType

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
DA
На сайте с 19.05.2011
Offline
8
#8

select DATE_FORMAT(`paymentDate`, '%Y.%c') as month, count(*), sum(`paymentSumm`) from paymentslist where `paymentType`='Webmoney' group by month order by month desc

EM
На сайте с 16.12.2005
Offline
108
#9
DmitryAnt:
select DATE_FORMAT(`paymentDate`, '%Y.%c') as month, count(*), sum(`paymentSumm`) from paymentslist where `paymentType`='Webmoney' group by month order by month desc

Минус такого запроса в том, что в пролете оказываются те месяцы, где не было ни одного платежа через Webmoney.

e_moon добавил 28.11.2011 в 16:16

edogs:
sum(if(s.paymentType='Webmoney',paymentSumm,0))

edogs добавил 28.11.2011 в 15:20

group by dateDiff , s.paymentType

Здесь я получаю список всех способов оплаты, месяц не уникальный при таком способе GROUP BY.

Т.е. результат такой:

11-2011 | 2 | 80

11-2011 | 1 | 100

10-2011 | 1 | 50

10-2011 | 1 | 20

А вот такой вывод получить не получается никак:

месяц -> количество платежей всего (всеми способами) -> сумма (только по WebMoney)

Т.е. такого вида:

11-2011 | 3 | 80

10-2011 | 2 | 50

C
На сайте с 04.02.2005
Offline
291
#10

Если нет дат в самой таблице, то и понятно, что вы

и получите

Минус такого запроса в том, что в пролете оказываются те месяцы, где не было ни одного платежа через Webmoney.

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

Вот здесь создают календарь

creative-territory.net/post/view/id/31/

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий