contar comprador existente con MySQL

Fachry Dzaky:

tengo tabla de este modo con la versión 5.7 de MySQL

CREATE TABLE order_match (
  ID INT,
  user_id INT,
  createdAt DATE,
  status_id INT,
  quantity INT
);

INSERT INTO order_match VALUES
  (1, 12, '2020-01-01', 4, 1),
  (2, 12, '2020-01-03', 7, 1),
  (3, 12, '2020-01-06', 7, 2),
  (4, 13, '2020-01-02', 5, 2),
  (5, 13, '2020-01-03', 6, 1),
  (6, 14, '2020-03-03', 8, 0.5),
  (7, 13, '2020-03-04', 4, 1),
  (8, 15, '2020-04-04', 7, 3),
  (9, 14, '2020-03-02', 7, 2),
  (10, 14, '2020-03-10', 5, 4),
  (11, 13, '2020-04-10', 8, 3),
  (12, 13, '2020-04-11', 8, 2),
  (13, 16, '2020-04-15', 8, 3);

select * from order_match
order by createdAt;

la salida al igual que este

+---------+---------+------------+-----------+----------+
|   ID    | user_id | createdAt  | status_id | quantity |
+---------+---------+------------+-----------+----------+
| 1       |      12 | 2020-01-01 |         4 |        1 |
| 4       |      13 | 2020-01-02 |         5 |        2 |
| 2       |      12 | 2020-01-03 |         7 |        1 |
| 5       |      13 | 2020-01-03 |         6 |        1 |
| 3       |      12 | 2020-01-06 |         7 |        2 |
| 9       |      14 | 2020-03-02 |         7 |        2 |
| 6       |      14 | 2020-03-03 |         8 |        1 |
| 7       |      13 | 2020-03-04 |         4 |        1 |
| 10      |      14 | 2020-03-10 |         5 |        4 |
| 8       |      15 | 2020-04-04 |         7 |        3 |
| 11      |      13 | 2020-04-10 |         8 |        3 |
| 12      |      13 | 2020-04-11 |         8 |        2 |
| 13      |      16 | 2020-04-15 |         8 |        3 |
| 13 rows |         |            |           |          |
+---------+---------+------------+-----------+----------+

con ID que el ID de transacción, user_id como el comprador que hace la transacción, createdAt que ocurra la transacción fecha, status_id como el estado de la transacción (que 4, 5, 6, 8 como la transacción de aprobación) y la cantidad como la cantidad de cantidad de cada transacción

este es el violín , así que quiero averiguar la estadística de la cantidad de la transacción, el importe total de la cantidad y la frecuencia total de usuarios únicos entre 03/01/2020 hasta 04/01/2020, único de usuario es el usuario que hace su primera transacción aprobación antes de 03/01/2020 y por lo menos hace la transacción de 1 aprobación entre 03/01/2020 hasta 04/01/2020, basado en la tabla que hice el resultado esperado como este

+------------+------------------+-----------------+
| count user | total_order (kg) | total_order (x) |
+------------+------------------+-----------------+
|          1 |                1 |               1 |
+------------+------------------+-----------------+

explicación: como sabemos que el usuario que se convierten usuario único en entre 03/01/2020 hasta 04/01/2020 user_id son 13, porque haciendo su primera transacción aprobación el 01.02.2020 (antes del 03/01/2020) y a continuación, haciendo su transacción aprobación al menos una vez en 03/01/2020 hasta 01/04/2020, en rango de tiempo, user_id 13 (usuario recuento) haciendo 1 transacción (total_order (x)) y la cantidad son 1 kg (total_order ( kg )

He haciendo esta sintaxis

select
       count(distinct om.user_id) as count,
       sum(om.quantity) as total_order_kg,
       count(om.id) as order_x
  from (select count(xx.count_) as count_
          from (select count(user_id) as count_ from order_match
                where status_Id in (4, 5, 6, 8)
                 group by user_id
                 ) xx
        ) x1,
        (select user_id
           from order_match
          group by user_id
          ) yy,
        order_match om
 where yy.user_id = om.user_id and
 status_id in (4, 5, 6, 8)
 and om.createdAt < '2020-03-01'
   and  EXISTS (select 1 from order_match om2
                where om.user_id = om2.user_id
               and status_id in (4, 5, 6, 8)
                  and om2.createdAt >= '2020-03-01'
                  and om2.createdAt <= '2020-04-01');

pero idk por qué el resultado como este

+------------+------------------+-----------------+
| count user | total_order (kg) | total_order (x) |
+------------+------------------+-----------------+
|          1 |                3 |               2 |
+------------+------------------+-----------------+

el violín

akina:
-- separate users statistic
SELECT user_id,
       SUM(quantity * (createdAt >= @start)) total_order_kg,
       SUM(createdAt >= @start) order_x
FROM order_match
WHERE createdAt <= @finish
GROUP BY user_id
HAVING SUM(createdAt >= @start)
   AND SUM(createdAt >= @start) < COUNT(createdAt);
-- overall statistic
SELECT COUNT(*) users_count,
       SUM(order_kg) total_order_kg,
       SUM(order_count) total_order_count
FROM ( SELECT user_id,
              SUM(quantity * (createdAt >= @start)) order_kg,
              SUM(createdAt >= @start) order_count
       FROM order_match
       WHERE createdAt <= @finish
       GROUP BY user_id
       HAVING SUM(createdAt >= @start)
          AND SUM(createdAt >= @start) < COUNT(createdAt) ) totals;

violín

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=373525&siteId=1
Recomendado
Clasificación