Форум по программам и оборудованию > > >

Запрос, выводящий топ карт с максимальными суммами покупок за определенный период

19.06.2018 7:49


[ОТВЕТИТЬ]
20.11.2013 11:24
Dim
 
нужен запрос, выводящий топ, ну например 10, карт с максимальными суммами покупок за определенный период.
20.11.2013 14:45
vdm
 
Карты есть разные, клиентские и дисконтные.
20.11.2013 15:25
vdm
 
v49.

Возвраты вычитаются, карты отбираются только активные (без учета блокировки самого клиента).

Цитата:
SELECT cr.start_card_code card,
sum(if(h.TYPE IN (1, 4, 9, 10), -d.amount, d.amount)) cardsum
FROM
trm_out_receipt_header h
INNER JOIN trm_out_receipt_subtotal d
ON h.cash_id = d.cash_id AND h.id = d.id
INNER JOIN trm_out_receipt_footer f
ON f.cash_id = d.cash_id AND f.id = d.id
INNER JOIN trm_in_cards cr
ON cr.global_id = 0 AND cr.id = h.card
WHERE
cr.deleted = 0 AND cr.active = 1
AND f.RESULT = 0
AND h.TYPE IN (0, 5, 1, 4, 8, 9, 10)
AND f.DATE BETWEEN '2013-10-01 00:00:00' AND '2013-10-01 23:59:59'
GROUP BY card
ORDER BY cardsum DESC
LIMIT 10;
20.11.2013 16:24
Dim
 
все работает, спасибо огромное. дальше сам доделаю
21.11.2013 11:52
Dim
 
добавил вывод фамилии и имени и добавил условие на отбор активных клиентов... считает ооооочень долго... можно соптимизировать как-нито?

Цитата:
SELECT cr.start_card_code card, cl.sur_name, cl.name,
sum(if(h.TYPE IN (1, 4, 9, 10), -d.amount, d.amount)) cardsum
FROM
trm_out_receipt_header h
INNER JOIN trm_out_receipt_subtotal d
ON h.cash_id = d.cash_id AND h.id = d.id
INNER JOIN trm_out_receipt_footer f
ON f.cash_id = d.cash_id AND f.id = d.id
INNER JOIN trm_in_cards cr
ON cr.global_id = 0 AND cr.id = h.card
INNER JOIN trm_in_card_client ccl
ON ccl.card=cr.id
INNER JOIN trm_in_clients cl
ON cl.id=ccl.client
WHERE
cr.deleted = 0 AND cr.active = 1
AND cl.active=1 AND cl.deleted=0
AND f.RESULT = 0
AND h.TYPE IN (0, 5, 1, 4, 8, 9, 10)
AND f.DATE BETWEEN '2013-10-01 00:00:00' AND '2013-10-31 23:59:59'
GROUP BY card
ORDER BY cardsum DESC
LIMIT 10;
21.11.2013 12:42
vdm
 
Код:
INNER JOIN trm_in_card_client ccl
ON ccl.global_id = cr.global_id and ccl.card = cr.id
INNER JOIN trm_in_clients cl
ON cl.global_id = ccl.global_id AND cl.id = ccl.client
21.11.2013 12:51
Dim
 
у меня global_id везде 0 ((

mysql> select distinct global_id from trm_in_card_client;
+-----------+
| global_id |
+-----------+
| 0 |
+-----------+
1 row in set (0.00 sec)

mysql> select distinct global_id from trm_in_clients;
+-----------+
| global_id |
+-----------+
| 0 |
+-----------+
1 row in set (0.01 sec)
21.11.2013 12:55
vdm
 
Так и должно быть.
Не знаю, для чего это поле, но оно входит в индекс и без его указания тормоза обеспечены.
В запросах веб-интерфейса сам С+ местами пишет where global_id=0 ...
21.11.2013 13:07
Dim
 
афигеть... 2 часа ждал, а с глобал_ид за 20 сек все сформировалось!!!
25.11.2013 18:09
kamres
 
Цитата:
vdm v49.

SELECT cr.start_card_code card,
sum(if(h.TYPE IN (1, 4, 9, 10), -d.amount, d.amount)) cardsum
FROM
trm_out_receipt_header h
INNER JOIN trm_out_receipt_subtotal d
ON h.cash_id = d.cash_id AND h.id = d.id
INNER JOIN trm_out_receipt_footer f
ON f.cash_id = d.cash_id AND f.id = d.id
INNER JOIN trm_in_cards cr
ON cr.global_id = 0 AND cr.id = h.card
WHERE
cr.deleted = 0 AND cr.active = 1
AND f.RESULT = 0
AND h.TYPE IN (0, 5, 1, 4, 8, 9, 10)
AND f.DATE BETWEEN '2013-10-01 00:00:00' AND '2013-10-01 23:59:59'
GROUP BY card
ORDER BY cardsum DESC
LIMIT 10;

Возвраты вычитаются, карты отбираются только активные (без учета блокировки самого клиента).
А есть ли такой же только для дисконтных карт?
26.11.2013 13:19
vdm
 
Цитата:
kamres А есть ли такой же только для дисконтных карт?
Примерно так. Если в чеке несколько карт, его полная сумма пойдет на каждую.
Код:
SELECT ds.card_number card,
       sum(if(h.TYPE IN (1, 4, 9, 10), -d.amount, d.amount)) cardsum
FROM
  trm_out_receipt_header h
INNER JOIN trm_out_receipt_subtotal d
  ON h.cash_id = d.cash_id AND h.id = d.id
INNER JOIN trm_out_receipt_footer f
  ON f.cash_id = d.cash_id AND f.id = d.id
INNER JOIN trm_out_receipt_discounts ds
  ON ds.cash_id = h.cash_id AND ds.receipt_header = h.id
WHERE
  ds.card_number IS NOT NULL
  AND ds.amount<0
  AND f.RESULT = 0
  AND h.TYPE IN (0, 5, 1, 4, 8, 9, 10)
  AND f.DATE BETWEEN '2013-10-01 00:00:00' AND '2013-10-01 23:59:59'
GROUP BY
  ds.card_number
ORDER BY
  cardsum DESC
LIMIT
  10;
27.11.2013 11:52
kamres
 
Цитата:
vdm Примерно так. Если в чеке несколько карт, его полная сумма пойдет на каждую.
Код:
SELECT ds.card_number card,
       sum(if(h.TYPE IN (1, 4, 9, 10), -d.amount, d.amount)) cardsum
FROM
  trm_out_receipt_header h
INNER JOIN trm_out_receipt_subtotal d
  ON h.cash_id = d.cash_id AND h.id = d.id
INNER JOIN trm_out_receipt_footer f
  ON f.cash_id = d.cash_id AND f.id = d.id
INNER JOIN trm_out_receipt_discounts ds
  ON ds.cash_id = h.cash_id AND ds.receipt_header = h.id
WHERE
  ds.card_number IS NOT NULL
  AND ds.amount<0
  AND f.RESULT = 0
  AND h.TYPE IN (0, 5, 1, 4, 8, 9, 10)
  AND f.DATE BETWEEN '2013-10-01 00:00:00' AND '2013-10-01 23:59:59'
GROUP BY
  ds.card_number
ORDER BY
  cardsum DESC
LIMIT
  10;
Так не получил данных, а вот так все получилось:

Код:
SELECT ds.card_number card,
       sum(if(h.TYPE IN (1, 4, 9, 10), -d.amount, d.amount)) cardsum
FROM
  trm_out_receipt_header h
INNER JOIN trm_out_receipt_subtotal d
  ON h.cash_id = d.cash_id AND h.id = d.id
INNER JOIN trm_out_receipt_footer f
  ON f.cash_id = d.cash_id AND f.id = d.id
INNER JOIN trm_out_receipt_discounts ds
  ON ds.cash_id = h.cash_id AND ds.receipt_header = h.id
WHERE
  ds.deleted = 0 
  AND ds.card_number IS NOT NULL
  AND f.RESULT = 0
  AND h.TYPE IN (0, 5, 1, 4, 8, 9, 10)
  AND f.DATE BETWEEN '2013-10-01 00:00:00' AND '2013-10-01 23:59:59'
  GROUP BY ds.card_number
  ORDER BY cardsum DESC
  LIMIT 10;
Опции темы


Часовой пояс GMT +3, время: 07:49.

 

Форум сделан на основе vBulletin®
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.