mysql - 按总值(value)和交易总数查找顶级支付类型

标签 mysql group-by left-join

我有表 Payments,其中包含以下数据:

模式(MySQL v5.7)

CREATE TABLE payments (
  Transaction_ID INT NOT NULL,
  Business_ID INT NOT NULL,
  Payment_Amount DECIMAL(25,2),
  Payment_Type VARCHAR(6),
  PRIMARY KEY (Transaction_ID)
 );

CREATE TABLE business_results (
  Business_ID INT NOT NULL,
  Top_Payment_Type_by_Dollar_Amount VARCHAR(6),
  Top_Payment_Type_by_Transactions VARCHAR(6),
  PRIMARY KEY (Business_ID)
);

INSERT INTO payments (Transaction_ID, Business_ID, Payment_Amount, Payment_Type)
  VALUES (1,2, 3.00, 'CASH'),
    (2,1,15.00,'CREDIT'),
    (3,4,5.00,'CASH'),
    (4,3,31.00,'CASH'),
    (5,4,2.00,'CREDIT'),
    (6,2,25.00,'CASH'),
    (7,2,30.00,'CREDIT'),
    (8,3,16.00,'CASH'),
    (9,1,7.00,'CREDIT'),
    (10,4,4.00,'CREDIT');

查询#1

select * from payments;

| Transaction_ID | Business_ID | Payment_Amount | Payment_Type |
| -------------- | ----------- | -------------- | ------------ |
| 1              | 2           | 3              | CASH         |
| 2              | 1           | 15             | CREDIT       |
| 3              | 4           | 5              | CASH         |
| 4              | 3           | 31             | CASH         |
| 5              | 4           | 2              | CREDIT       |
| 6              | 2           | 25             | CASH         |
| 7              | 2           | 30             | CREDIT       |
| 8              | 3           | 16             | CASH         |
| 9              | 1           | 7              | CREDIT       |
| 10             | 4           | 4              | CREDIT       |

View on DB Fiddle

交易类型由“信用”或“现金”组成

我正在尝试创建具有以下结果的查询:

  • 第 1 列:Business_ID
  • 第 2 列:说明哪种支付类型具有最大的总美元金额(按支付类型的总和)
  • 第 3 列:说明哪种支付类型的交易次数最多

根据提供的数据,结果应该如下:


+-------------+-----------------------------------+----------------------------------+
| Business_ID | Top_Payment_Type_by_Dollar_Amount | Top_Payment_Type_by_Transactions |
+-------------+-----------------------------------+----------------------------------+
|           1 | CREDIT                            | CREDIT                           |
|           2 | CREDIT                            | CASH                             |
|           3 | CASH                              | CASH                             |
|           4 | CREDIT                            | CREDIT                           |
+-------------+-----------------------------------+----------------------------------+

我将如何在单个 MySQL 查询中执行此操作?

--

最佳答案

所以,问题的第一部分可以这样解决...

SELECT x.business_id
     , x.payment_type
  FROM payments x 
  JOIN 
     ( SELECT business_id
            , MAX(payment_amount) payment_amount 
         FROM (SELECT * FROM payments) n
        GROUP  
           BY business_id
     ) y 
    ON y.business_id = x.business_id 
   AND y.payment_amount = x.payment_amount
 ORDER
    BY x.business_id;

...子查询 n 并非绝对必要 - 我可以(也应该)使用 FROM payments,但这样它提供了解决问题的线索问题的下一部分,基本上,您只需要将 n 替换为...

SELECT business_id
     , payment_type
     , SUM(payment_amount) total 
  FROM payments 
 GROUP 
    BY business_id
     , payment_type; 

...并略微调整主连接子句

关于mysql - 按总值(value)和交易总数查找顶级支付类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54447812/

相关文章:

php 和 MySQL 只显示第一个单词

stored-procedures - 如果用户未在前端输入,如何使用 MySql 过程根据某些输入过滤器显示结果而忽略其他过滤器?

mysql - NOT IN 不在 mysql 程序中工作

MySQL GROUP BY 和 INNER JOIN - 按连接字段分组

sql - "Symmetric"多列 GROUP BY

sql - Oracle SQL 中的高效四向联接

php - 让我的查询更短、更快、更好

mysql - 计算mysql中的列项目

C# LINQ Multiple GroupJoin 使用 Lambda 语法

mysql - SQL 左连接计数