【问题标题】:MySQL SELECT to get total sales by payment method and statusMySQL SELECT 按付款方式和状态获取总销售额
【发布时间】:2021-11-12 21:08:15
【问题描述】:

我有一些销售数据如下:

SELECT bv.sale_time
     , amount_due
     , round(sum(amount_paid), 2) as paid
     , m.payment_method_id
     , m.method
     , bt.payment_status
FROM basket_amount_due bv 
  JOIN basket bt USING(basket_id)
  LEFT JOIN basket_payment p USING (basket_id)
  JOIN payment_method m USING(payment_method_id)
GROUP BY bv.basket_id;

+---------------------+------------+---------+-------------------+-------------------+----------------+
| sale_time           | amount_due | paid    | payment_method_id | method            | payment_status |
+---------------------+------------+---------+-------------------+-------------------+----------------+
| 2021-09-18 12:19:04 |    1170.00 | 1170.00 |                 1 | CASH              | paid           |
| 2021-09-18 12:19:39 |     756.60 |    0.00 |                 1 | CASH              | due            |
| 2021-09-18 12:20:22 |    1115.50 | 1000.00 |                 1 | CASH              | partial        |
| 2021-09-18 12:21:47 |     990.00 |  990.00 |                 4 | Cash on Delivery  | paid           |
| 2021-09-18 12:23:33 |     698.40 |    0.00 |                 4 | Cash on Delivery  | due            |
| 2021-09-18 12:29:45 |    2070.00 | 2070.00 |                 2 | Credit/Debit Card | paid           |
+---------------------+------------+---------+-------------------+-------------------+----------------+
6 rows in set (0.004 sec)

我的问题是,现在我需要按付款方式和付款状态获取总销售额。这意味着我想要,

  • 现金销售总额(= 现金(已支付)+ 现金(部分支付)+ 货到付款 (付费))
  • 赊销总额(= 现金(到期)+ 现金(部分到期)+ 货到付款 (到期))
  • 货到付款销售总额(= 货到付款(已支付)+ 现金 交货时(到期))
  • 信用卡总销售额(信用卡(付费))

使用上述查询的输出,我期望的数字输出如下:

  • 现金销售总额 = (1170.00 + 1000.00 + 990.00)
  • 总信用销售 = (756.60 + (1115.50 - 1000.00) + 698.40)
  • 货到付款销售总额 = (990.00 + 698.40)
  • 卡片总销售额 = (2070.00)

注意:如等式所示(支付方式(支付状态))。 Ex: (cash (paid))

这是我到目前为止的查询。希望有人可以帮助我解决这个问题。

SELECT DATE(bv.sale_time)
     , CASE 
        WHEN p.payment_method_id IN (1, 2) 
          THEN sum(amount_due) 
          ELSE 0 
        END AS total_cash_sales
     , CASE p.payment_method_id
        WHEN 4 THEN sum(amount_due) ELSE 0 END AS total_credit_sales
FROM basket_amount_due bv 
  JOIN basket bt USING(basket_id)
  LEFT JOIN basket_payment p USING (basket_id)
  JOIN payment_method m USING(payment_method_id)
WHERE DATE(bv.sale_time) = CURDATE() 
GROUP BY p.payment_method_id;

【问题讨论】:

  • 您是否考虑过在查询中使用 5 个子选择?
  • ` 1 AND 2` 始终为真。 DATE 不需要包装 sale_time。编写一个 case 表达式,计算出 4 个类别中每个类别的唯一编号,然后编写 group by 表达式标识符。
  • @danblack 我可以看一个例子吗?

标签: mysql sql select


【解决方案1】:

如果你回到每个总数的主成分:

SELECT
  SUM(IF(bt.payment_method_id IN (1,4), amount_paid, 0)) as cash_sales,
  SUM(IF(bt.payment_method_id IN (1,4), amount_due - amount_paid, 0)) as credit_sales,
  SUM(IF(bt.payment_method_id = 4, amount_due, 0) AS COD_Sales,
  SUM(IF(bt.payment_method_id = 2, amount_due, 0) AS card_sales
FROM basket_amount_due bv 
  JOIN basket bt USING(basket_id)
WHERE DATE(bv.sale_time) = CURDATE() 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多