同时使用GROUPBY时如何运行mysql循环

同时使用GROUPBY时如何运行mysql循环,mysql,Mysql,我有以下四个表格: 成员 如果代理是指销售代理id,则成员id对于每个客户都是唯一的,包括与该成员关联的名字和姓氏 选择 它详细说明了每个成员所做的选择,为了简单起见,本例中列出的每个成员都被选为programID的1、2和3的一部分 组 此表详细说明了每个唯一programID的成本和系统类型 薪酬水平 此表根据每个特定代理的级别和使用上述组中的系统类型突出显示了每个代理的销售佣金结构 在本例中,我们假设代理123处于佣金级别2 最终,我试图建立一个报告系统,根据单个代理商和一组代理商的销售额

我有以下四个表格:

成员 如果代理是指销售代理id,则成员id对于每个客户都是唯一的,包括与该成员关联的名字和姓氏

选择 它详细说明了每个成员所做的选择,为了简单起见,本例中列出的每个成员都被选为programID的1、2和3的一部分

组 此表详细说明了每个唯一programID的成本和系统类型

薪酬水平 此表根据每个特定代理的级别和使用上述组中的系统类型突出显示了每个代理的销售佣金结构

在本例中,我们假设代理123处于佣金级别2

最终,我试图建立一个报告系统,根据单个代理商和一组代理商的销售额、各自的佣金水平以及他们带来的销售类型,详细说明他们的佣金结构

我当前的sql语句(不满足我的需要)是:

此查询的结果是:

memberid   |  firstname   | lastname   |   Cost   |   Commission
================================================================
   444     |   john       | smith      |   60.00  |   27.00
   555     |   sarah      | stevens    |   60.00  |   27.00
   666     |   harry      | tabor      |   60.00  |   27.00
我面临的问题是,resultset采用第一个大小写匹配并应用于返回的几行,而实际上它应该只应用于每一行,然后对结果进行分组

在上面的例子中,每个特定成员的佣金应该是15.18美元(20美元的30%+30美元的18%+40美元的11%),但它取而代之的是案例1,并将30%的佣金应用于每个结果(90美元的30%)


我已经尝试过几种不同的方法,但是我不知道如何在一个查询中组合我要做的事情(此查询仅从mysql gui运行,因此使用任何编程语言都是不可接受的。

我认为主要问题是您在
分组中使用了
CASE
不正确。我认为如果您尝试类似的操作,大多数SQL平台都会抱怨,但mysql只会给您一个下铺/随机结果并微笑

无论如何,我认为由于不寻常的模式,您必须使用子查询来获取所需的内容

SELECT 
    sq.memberid, sq.firstname, sq.lastname, 
    SUM(sq.cost) AS total_cost, SUM(sq.commission) AS total_commission
FROM 
(
    SELECT 
    m.memberid, m.firstname, m.lastname, g.cost, 
    CASE
        WHEN g.type = '7' THEN (g.cost * cl.type1)
        WHEN g.type = '8' THEN (g.cost * cl.type2)
        WHEN g.type = '9' THEN (g.cost * cl.type3)
    END as commission
    FROM members m
    LEFT JOIN selections s USING(memberid)
    LEFT JOIN groups g USING(programid)
    LEFT JOIN comp_levels cl ON cl.level = '2'
    WHERE m.agent = '123' 
) sq GROUP BY sq.memberid
您可以自行运行子查询来跟踪发生了什么

使用您的数据,它会给出结果

+----------+-----------+----------+------------+------------------+
| memberid | firstname | lastname | total_cost | total_commission |
+----------+-----------+----------+------------+------------------+
|      444 | john      | smith    |      90.00 |           15.800 |
|      555 | sarah     | stevens  |      90.00 |           15.800 |
|      777 | harry     | tabour   |      90.00 |           15.800 |
+----------+-----------+----------+------------+------------------+

注意:由于异常(缺乏)规范化,即将类型(7,8,9)映射到类型字段(type1、type2、type3),这是一个棘手的问题。此外,我认为您可能在测试数据描述中有一些输入错误;即SQL中的类型值,以及查询输出和所需结果中的总成本。

谢谢您的回答。我需要根据我的具体说明进行修改,但需要了解您文章的总体概念。我想nk我使用的表格确实有标准化,但可能很难理解。本质上,网站正在检查“如果类型=7(如果项目是出售的棒球),则该项目基于代理级别的佣金级别等于X(依此类推)。
level  |   type1   |   type2   |   type3
============================================
   1   |   0.25    |   0.15    |  0.1
   2   |   0.3     |   0.18    |  0.11
   3   |   0.35    |   0.2     |  0.12
   4   |   0.4     |   0.225   |  0.15
   5   |   0.425   |   0.25    |  0.17
   6   |   0.45    |   0.27    |  0.2
   7   |   0.47    |   0.28    |  0.22
   8   |   0.5     |   0.3     |  0.24
select
    a.memberid,
    a.firstname,
    a.lastname,
    sum(c.cost) as Cost,
CASE
    when c.type = '5' THEN (SUM(c.cost) * d.type1)
    when c.type = '6' THEN (SUM(c.cost) * d.type2)
    when c.type = '7' THEN (SUM(c.cost) * d.type3)
END as Commission
FROM
    members a
left join selections b using(memberid)
left join groups c using(programid)
left join comp_levels d on d.level = '2'
where agent = '123'
GROUP BY a.memberid;
memberid   |  firstname   | lastname   |   Cost   |   Commission
================================================================
   444     |   john       | smith      |   60.00  |   27.00
   555     |   sarah      | stevens    |   60.00  |   27.00
   666     |   harry      | tabor      |   60.00  |   27.00
SELECT 
    sq.memberid, sq.firstname, sq.lastname, 
    SUM(sq.cost) AS total_cost, SUM(sq.commission) AS total_commission
FROM 
(
    SELECT 
    m.memberid, m.firstname, m.lastname, g.cost, 
    CASE
        WHEN g.type = '7' THEN (g.cost * cl.type1)
        WHEN g.type = '8' THEN (g.cost * cl.type2)
        WHEN g.type = '9' THEN (g.cost * cl.type3)
    END as commission
    FROM members m
    LEFT JOIN selections s USING(memberid)
    LEFT JOIN groups g USING(programid)
    LEFT JOIN comp_levels cl ON cl.level = '2'
    WHERE m.agent = '123' 
) sq GROUP BY sq.memberid
+----------+-----------+----------+------------+------------------+
| memberid | firstname | lastname | total_cost | total_commission |
+----------+-----------+----------+------------+------------------+
|      444 | john      | smith    |      90.00 |           15.800 |
|      555 | sarah     | stevens  |      90.00 |           15.800 |
|      777 | harry     | tabour   |      90.00 |           15.800 |
+----------+-----------+----------+------------+------------------+