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 |
+------------+------------------+-----------------+
-- 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;