Невозможно использовать сумму или счет mysql 5,7 - PullRequest
0 голосов
/ 06 августа 2020

Допустим, у меня есть таблица типа this

CREATE TABLE order_match(ID int(10) NOT NULL PRIMARY KEY AUTO_INCREMENT,
quantity decimal(10,2), createdAt date NOT NULL, order_status_id int(10) NOT NULL,
createdby int(11), code_order varchar(20) NOT NULL);

CREATE TABLE air_way_bills (id int(10) NOT NULL PRIMARY KEY AUTO_INCREMENT,
code_order varchar(30) NOT NULL, customer_regency varchar(30) NOT NULL);

insert into air_way_bills values
(1, 0001, 'KOTA DEPOK'),
(2, 0002, 'KOTA JAKARTA'),
(3, 0003, 'KOTA BOGOR'),
(4, 0004, 'KOTA BOGOR'),
(5, 0005, 'KOTA TANGERANG'),
(6, 0006, 'KOTA JAMBI'),
(7, 0007, 'KOTA BOGOR'),
(8, 0009, 'KOTA TANGERANG');

insert into order_match values
(1, 0.2, '2020-02-02', 6, 01, 0001),
(2, 1, '2020-02-03', 7, 02, 0002),
(3, 1.3, '2020-02-04', 7, 03, 0003),
(4, 1.4, '2020-02-08', 5, 08, 0004),
(5, 1.2, '2020-02-05', 8, 04, 0005),
(6, 1.4, '2020-03-01', 8, 05, 0006),
(7, 0.23, '2020-01-01', 8, 03, 0007),
(8, 2.3, '2020-02-07', 8, 04, 0009);

это таблица order_match, идентификатор с первичным ключом, количество - это количество транзакции, createdAt - дата транзакция, order_status_id - это статус транзакции (с order_status_id 7 не подтвержденная транзакция), createdby - пользователи, а code_order - это пункт назначения и связанный с air_way_bills столбец code_order

+----+----------+------------+-----------------+-----------+------------+
| ID | quantity | createdAt  | order_status_id | createdby | code_order |
+----+----------+------------+-----------------+-----------+------------+
|  1 |     0.20 | 2020-02-02 |               6 |         1 |          1 |
|  2 |     1.00 | 2020-02-03 |               7 |         2 |          2 |
|  3 |     1.30 | 2020-02-04 |               7 |         3 |          3 |
|  4 |     1.40 | 2020-02-08 |               5 |         8 |          4 |
|  5 |     1.20 | 2020-02-05 |               8 |         4 |          5 |
|  6 |     1.40 | 2020-03-01 |               8 |         5 |          6 |
|  7 |     0.23 | 2020-01-01 |               8 |         3 |          7 |
|  8 |     2.30 | 2020-02-07 |               8 |         4 |          9 |
+----+----------+------------+-----------------+-----------+------------+

это таблица air_way_bills, with order_match.code_order = air_way_bills.code_order

+----+------------+------------------+
| id | code_order | customer_regency |
+----+------------+------------------+
|  1 |          1 | KOTA DEPOK       |
|  2 |          2 | KOTA JAKARTA     |
|  3 |          3 | KOTA BOGOR       |
|  4 |          4 | KOTA BOGOR       |
|  5 |          5 | KOTA TANGERANG   |
|  6 |          6 | KOTA JAMBI       |
|  7 |          7 | KOTA BOGOR       |
|  8 |          9 | KOTA TANGERANG   |
+----+------------+------------------+

Я хочу узнать новых пользователей (созданных) в диапазоне дат от «2020-02-03» до «2020-02-07» ​​с транзакцией утверждения (order_status_id не в 7) и сортировать по месту назначения. новые пользователи - это пользователи, которые выполняют транзакцию между датой диапазона, но никогда не выполняют транзакцию до диапазона дат (в данном случае до '2020-02-03')

Я использовал этот запрос

SELECT COALESCE(customer_regency, 'Total') AS `Destination`, 
       SUM(quantity) AS `Qty(kg)`,
       round(SUM(quantity) / any_value(totalsum) * 100, 1) AS `Qty(%)`, 
       COUNT(a.id) AS `Jumlah Order`,
       round(COUNT(a.id) / any_value(totalcount) * 100, 1) AS `Jumlah Order(%)`
FROM order_match a

/* 1 */ INNER JOIN air_way_bills b
/* 1 */ ON a.code_order = b.code_order
/* 2 */ INNER JOIN ( SELECT s1.createdby
               FROM order_match s1
               WHERE s1.order_status_Id in (4, 5, 6, 8)
               GROUP BY s1.createdby
               HAVING COUNT(s1.createdAt BETWEEN '2020-02-03' AND '2020-02-07') >= 1)
                  AND COUNT(s1.createdAt < '2020-02-03') = 0 ) clients 
/* 2 */ ON a.createdby = clients.createdby
JOIN ( SELECT SUM(quantity) totalsum, 
              COUNT(id) totalcount 
       FROM order_match
/* 3 */  INNER JOIN ( SELECT s2.createdby
                      FROM order_match s2
                      WHERE s2.order_status_id in (4, 5, 6, 8)
                      GROUP BY s2.createdby
                      HAVING COUNT(s2.createdAt BETWEEN '2020-02-03' AND '2020-02-07') >= 1)
                         AND COUNT(s2.createdAt < '2020-02-03') = 0 ) clients
/* 3 */ ON order_match.createdby = clients.createdby
       WHERE order_status_Id in (4, 5, 6, 8)) totals
WHERE a.order_status_Id in (4, 5, 6, 8)
GROUP BY customer_regency WITH ROLLUP;

но он говорит:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND COUNT(s1.createdAt < '2020-02-03') = 0 ) clients 
/* 2 */ ON a.createdby = c' at line 15

ожидаемые результаты

+----------------+---------+--------+--------------+-----------------+
| Destination    | Qty(kg) | Qty(%) | Count Order  | Count Order(%) |
+----------------+---------+--------+--------------+-----------------+
| KOTA TANGERANG |    3.50 |    100 |            2 |             100 |
| Total          |    3.50 |  100.0 |            2 |           100.0 |
+----------------+---------+--------+--------------+-----------------+

объяснение: поскольку пользователи (Createdby) 4 соответствуют только условию (выполнение транзакции в диапазоне даты и никогда выполняла транзакцию раньше и имела транзакцию подтверждения (order_status_id не в 7)

1 Ответ

1 голос
/ 06 августа 2020

Попробуйте выполнить следующий запрос:

SELECT COALESCE(customer_regency, 'Total') AS `Destination`,
       SUM(quantity) AS `Qty(kg)`,
       round(SUM(quantity) / any_value(totalsum) * 100, 1) AS `Qty(%)`,
       COUNT(a.id) AS `Jumlah Order`,
       round(COUNT(a.id) / any_value(totalcount) * 100, 1) AS `Jumlah Order(%)`
FROM order_match a

/* 1 */ INNER JOIN air_way_bills b
/* 1 */ ON a.code_order = b.code_order
/* 2 */ INNER JOIN ( SELECT s1.createdby
               FROM order_match s1
               WHERE s1.order_status_Id in (4, 5, 6, 8)
               GROUP BY s1.createdby
               HAVING (SUM(case when createdAt >= '2020-02-03' AND createdAt <= '2020-02-07' then 1 else 0 end) >= 1)
                  AND SUM(case when createdAt < '2020-02-03' then 1 else 0 end) = 0 ) clients
/* 2 */ ON a.createdby = clients.createdby
JOIN ( SELECT SUM(quantity) totalsum,
              COUNT(id) totalcount
       FROM order_match
/* 3 */  INNER JOIN ( SELECT s2.createdby
                      FROM order_match s2
                      WHERE s2.order_status_id in (4, 5, 6, 8)
                      GROUP BY s2.createdby
                      HAVING SUM(case when createdAt >= '2020-02-03' AND createdAt <= '2020-02-07' then 1 else 0 end) >= 1
                         AND SUM(case when createdAt < '2020-02-03' then 1 else 0 end) = 0  ) clients
/* 3 */ ON order_match.createdby = clients.createdby
       WHERE order_status_Id in (4, 5, 6, 8)) totals
WHERE a.order_status_Id in (4, 5, 6, 8)
GROUP BY customer_regency WITH ROLLUP;
  1. удалить лишнее ) после COUNT(s1.createdAt BETWEEN '2020-02-03' AND '2020-02-07') >= 1)
  2. изменить count на sum. их различия, пожалуйста, обратитесь к office do c

COUNT (выражение) возвращает количество строк, которые не содержат значений NULL в результате выражения.

Функция СУММ () - это агрегатная функция, которая позволяет вычислять сумму значений в наборе. Синтаксис функции СУММ () следующий:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...