SQL запрос, чтобы получить Net Salse за каждый месяц - PullRequest
0 голосов
/ 01 мая 2020

Я ищу запрос, чтобы получать ежемесячные продажи net Я пробовал это далеко, но я не мог получить то, что я хочу. это моя Order таблица

+----------+-----------+--------+------------+---------------+-------------+-----------+---------+---------+
| orderID  | custID    | userID | orderDate  | paymentMethod | grossAmount | netAmount | cash    | balance |
+----------+-----------+--------+------------+---------------+-------------+-----------+---------+---------+
| INV-0001 | CUST-0001 | U-001  | 2020-05-01 | Cash Pay      |      525.00 |    525.00 |  550.00 |   25.00 |
| INV-0002 | CUST-0001 | U-001  | 2020-05-01 | Cash Pay      |      240.00 |    240.00 |  250.00 |   10.00 |
| INV-0003 | CUST-0001 | U-001  | 2020-05-01 | Cash Pay      |      220.00 |    220.00 |  250.00 |   30.00 |
| INV-0004 | CUST-0001 | U-001  | 2020-04-30 | Cash Pay      |      895.00 |    895.00 | 1000.00 |  105.00 |
| INV-0005 | CUST-0001 | U-001  | 2020-04-30 | Cash Pay      |      300.00 |    300.00 |  500.00 |  200.00 |
| INV-0006 | CUST-0001 | U-001  | 2020-04-30 | Cash Pay      |      230.00 |    230.00 |  250.00 |   20.00 |
+----------+-----------+--------+------------+---------------+-------------+-----------+---------+---------+

это моя CustomerReturn таблица

+-------+----------+------------+--------+------------+-----------+-----------+-------------+
| retID | orderID  | itemCode   | userID | retDate    | returnQty | unitPrice | totalAmount |
+-------+----------+------------+--------+------------+-----------+-----------+-------------+
|     1 | INV-0001 | 1800232050 | U-001  | 2020-05-01 |      1.00 |    100.00 |      100.00 |
|     2 | INV-0002 | 1909873674 | U-001  | 2020-05-01 |      2.00 |     55.00 |      110.00 |
|     3 | INV-0004 | 1800232050 | U-001  | 2020-04-30 |      1.00 |    100.00 |      100.00 |
+-------+----------+------------+--------+------------+-----------+-----------+-------------+

формула (сумма ежемесячного счета (Order .netAmount) - итого ежемесячного дохода (CustomerReturn .totalAmount))

нуждающихся в net продажах каждый год каждого месяца.

select orderDate,sum(netAmount)-sum(totalAmount) from `Order` o,CustomerReturn r where o.orderID=r.orderID GROUP BY orderDate;

, когда я запускаю этот запрос, он показывает мне это

+------------+---------------------------------+
| orderDate  | sum(netAmount)-sum(totalAmount) |
+------------+---------------------------------+
| 2020-04-30 |                          795.00 |
| 2020-05-01 |                          555.00 |
+------------+---------------------------------+

но так и должно быть

+------------+---------------------------------+
| orderDate  | sum(netAmount)-sum(totalAmount) |
+------------+---------------------------------+
| 2020-04-30 |                         1425.00 |
| 2020-05-01 |                          775.00 |
+------------+---------------------------------+

пожалуйста, помогите мне. Спасибо.!

Ответы [ 3 ]

2 голосов
/ 01 мая 2020

Ваш запрос в порядке, он выбирает все записи, когда есть совпадение с OrderId в таблице CustomerReturn, и выполняет суммы по вашему запросу, однако для заказа нет возврата INV-0003 , таким образом, это условие o.orderID=r.orderID недопустимо, когда дело доходит до этой записи и игнорирует эти данные. Выполнение левого соединения решит проблему.

select 
    o.orderDate, 
    sum(o.netAmount)-sum(case when cr.totalAmount is null then 0 else cr.totalAmount end)
from 
    Orders o 
left join 
    CustomerReturn cr
on 
    o.orderID = cr.orderID
group by 
    o.orderDate

Левое соединение приведет к тому, что cr.totalAmount будет иметь нулевые значения, если не найдено совпадений для o.orderID=r.orderID, тогда мы используем эту часть; case when cr.totalAmount is null then 0 else cr.totalAmount end чтобы исправить эту нулевую проблему.

0 голосов
/ 01 мая 2020

Научитесь использовать правильный, явный, стандартный , читаемый JOIN синтаксис. Как указано в другом ответе, вы хотите LEFT JOIN. Тем не менее, проще написать логи c:

select o.orderDate, 
       sum(o.netAmount)- coalesce(sum(cr.totalAmount, 0)) as net_amount
from Orders o left join 
     CustomerReturn cr
     on o.orderID = cr.orderID
group by o.orderDate;
0 голосов
/ 01 мая 2020

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

select
    o.mm as month,
    sum(total_net_amount - total_amount) as total
from
(
  select
    month(orderDate) as mm,
    sum(netAmount) as total_net_amount
  from Orders
  group by
      month(orderDate)
) o
join
(
  select
    month(retDate) as mm,
    sum(totalAmount) as total_amount
  from CustomerReturn
  group by
      month(retDate)
) cr
on o.mm = cr.mm
group by
    o.mm

Вывод:

*--------------*
|month | total |
*--------------*
| 5    |  775  |
| 4    |  1325 |
*--------------*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...