繁体   English   中英

聚合函数未正确计数MYSQL

[英]Aggregate function not counting correctly MYSQL

我有一个查询,我试图用来根据用户ID来拉动我们公司的销售额。 它将拉出他们的名字/姓氏,地位,下线代表和最近输入的销售信息。 然后应该将所有销售额的美元金额相加并将其加在一起(注意:此列稍后添加为销售部门的临时修订。)。 然后,对于每笔交易,都应根据产品将美元价值转换为点值。 它还应找到销售的已提交总值和总关闭点值。 每个销售人员只需要1行。

这是查询的当前迭代:

SELECT preps_contracted_reps.first_name AS Rep_First_Name,
    preps_contracted_reps.last_name AS Rep_Last_Name,
    preps_contracted_reps_cstm.contact_status_reps_c AS Rep_Status,
    COUNT(wn_writing_number_cstm.id_c) AS Num_Reps_in_Downline,
    MAX(opportunities.date_entered) AS Date_Entered,
    aos_products.`name` AS Product_Name,
    SUM(opportunities_cstm.final_sale_amount_c) AS Total_in_Dollars,
    CASE 
        WHEN aos_products.NAME = 'LifeSure'
            THEN SUM(opportunities_cstm.final_sale_amount_c)
        WHEN aos_products.NAME LIKE '%SCF%'
            THEN SUM(opportunities_cstm.final_sale_amount_c * .125)
        WHEN aos_products.NAME LIKE '%(PAC)%'
            THEN SUM(opportunities_cstm.final_sale_amount_c * .833)
        WHEN aos_products.NAME LIKE '%Income Select%'
            AND aos_products.NAME NOT LIKE '%(PAC)%'
            THEN SUM(opportunities_cstm.final_sale_amount_c * .166)
        WHEN aos_products.NAME = 'Estate Enhancer'
            THEN SUM(opportunities_cstm.final_sale_amount_c * .333)
        WHEN aos_products.NAME LIKE '%Oil%'
            THEN SUM(opportunities_cstm.final_sale_amount_c * .33)
        WHEN aos_products.NAME LIKE '%Merchant Cash Advance%'
            THEN SUM(opportunities_cstm.final_sale_amount_c * .16)
        WHEN aos_products.NAME LIKE '%WB%'
            THEN SUM(opportunities_cstm.final_sale_amount_c * .025)
        WHEN aos_products.NAME LIKE '%Land Lease%'
            THEN SUM(opportunities_cstm.final_sale_amount_c * .625)
        WHEN aos_products.NAME LIKE '%Petro%'
            THEN SUM(opportunities_cstm.final_sale_amount_c * .625)
        ELSE opportunities_cstm.final_sale_amount_c
        END AS All_Time_Closed_Points,
    CASE 
        WHEN aos_products.NAME = 'LifeSure'
            THEN SUM(opportunities.amount)
        WHEN aos_products.NAME LIKE '%SCF%'
            THEN SUM(opportunities.amount * .125)
        WHEN aos_products.NAME LIKE '%(PAC)%'
            THEN SUM(opportunities.amount * .833)
        WHEN aos_products.NAME LIKE '%Income Select%'
            AND aos_products.NAME NOT LIKE '%(PAC)%'
            THEN SUM(opportunities.amount * .166)
        WHEN aos_products.NAME = 'Estate Enhancer'
            THEN SUM(opportunities.amount * .333)
        WHEN aos_products.NAME LIKE '%Oil%'
            THEN SUM(opportunities.amount * .33)
        WHEN aos_products.NAME LIKE '%Merchant Cash Advance%'
            THEN SUM(opportunities.amount * .16)
        WHEN aos_products.NAME LIKE '%WB%'
            THEN SUM(opportunities.amount * .025)
        WHEN aos_products.NAME LIKE '%Land Lease%'
            THEN SUM(opportunities.amount * .625)
        WHEN aos_products.NAME LIKE '%Petro%'
            THEN SUM(opportunities.amount * .625)
        ELSE opportunities.amount
        END AS All_Time_Submitted_Points
FROM wn_writing_number
RIGHT JOIN wn_writing_number_cstm
    ON wn_writing_number.id = wn_writing_number_cstm.id_c
INNER JOIN preps_contracted_reps_wn_writing_number_1_c
    ON wn_writing_number_cstm.id_c = preps_contracted_reps_wn_writing_number_1_c.preps_contracted_reps_wn_writing_number_1wn_writing_number_idb
INNER JOIN preps_contracted_reps
    ON preps_contracted_reps_wn_writing_number_1_c.preps_cont9effed_reps_ida = preps_contracted_reps.id
INNER JOIN preps_contracted_reps_cstm
    ON preps_contracted_reps.id = preps_contracted_reps_cstm.id_c
LEFT JOIN opportunities_cstm
    ON preps_contracted_reps.id = opportunities_cstm.preps_contracted_reps_id1_c
LEFT JOIN opportunities
    ON opportunities.id = opportunities_cstm.id_c
LEFT JOIN aos_products
    ON opportunities_cstm.aos_products_id_c = aos_products.id
LEFT JOIN aos_products_cstm
    ON aos_products.id = aos_products_cstm.id_c
WHERE preps_contracted_reps_cstm.preps_contracted_reps_id_c = "zcrm_1130062000004859021"
    AND preps_contracted_reps.deleted = "0"
    AND contact_status_reps_c <> "Terminated"
    AND contact_status_reps_c <> "Declined"
GROUP BY preps_contracted_reps.id
ORDER BY preps_contracted_reps_cstm.preps_contracted_reps_id_c ASC,
    Last_Name ASC,
    First_Name ASC,
    Date_Entered ASC

电流输出示例:

Rep_First_Name | Rep_Last_Name | Rep_Status | Num_Reps_in_Downline | Date_Entered | Product_Name | Total_in_Dollars | All_Time_Closed_Points | All_Time_Submitted_Points

          John |   Smith   |   Contracted   |        5         | 2017-12-05 14:6:41 | 12 Month Product | 393000.000000 | 245625.000000 | 233125 |
          Jane |   Doe     |  NeedsTraining |        0         | 2017-12-05 15:27:12| Null             |    Null       |    Null       |  Null  |

我遇到的问题是Case语句的计算不正确。 当我查看所有单个销售并进行计算时,我在All_Time_Closed_PointsAll_Time_Submitted_Points列中获得了不同的数字。

我在几个论坛中进行了搜索,发现了一些关于group by的问题的建议,但是当我尝试调整group by时,通常只返回1行,并将所有信息加在一起。 另外,我尝试了运行几种变体而没有聚合功能的情况。 我确实尝试只带回订单项,但我无法完全实现所有销售。 它只会带来1。也许是因为加入还是分组依据? 我不知道接下来要去哪里。 我没有在搜索正确的关键字或没有看到相关信息,但却不知道如何进行操作,这是非常现实的可能性。 感谢所有帮助。

编辑:我需要发生两件事之一。 我需要每个销售代表的所有销售额来计算其总销售额(当前是正确的),已提交的总积分和他们的总闭合点(目前都无法正确计算),或者我需要退回每笔销售所有代表以及aos_product。 name 当我删除分组依据以拉取各个代表的所有销售额时,它将汇总为一个代表,而不是230,并且所有统计信息加在一起。 因此,从这个角度来说,分组依据是错误的,但是我不确定接下来要添加的内容。 希望这有助于澄清。

编辑2:

SELECT 
    preps_contracted_reps.first_name AS Rep_First_Name,
    preps_contracted_reps.last_name AS Rep_Last_Name,
    preps_contracted_reps_cstm.contact_status_reps_c AS Rep_Status,
    COUNT(wn_writing_number_cstm.id_c) AS Num_Reps_in_Downline,
    MAX(opportunities.date_entered) AS Date_Entered,
    aos_products.`name` AS Product_Name,
    SUM(opportunities_cstm.final_sale_amount_c) AS Total_in_Dollars,
    opportunities_cstm.final_sale_amount_c,
    CASE 
        WHEN aos_products.NAME = 'LifeSure'
            THEN opportunities_cstm.final_sale_amount_c
        WHEN aos_products.NAME LIKE '%SCF%'
            THEN opportunities_cstm.final_sale_amount_c * .125
        WHEN aos_products.NAME LIKE '%(PAC)%'
            THEN opportunities_cstm.final_sale_amount_c * .833
        WHEN aos_products.NAME LIKE '%Income Select%' AND aos_products.NAME NOT LIKE '%(PAC)%'
            THEN opportunities_cstm.final_sale_amount_c * .166
        WHEN aos_products.NAME = 'Estate Enhancer'
            THEN opportunities_cstm.final_sale_amount_c * .333
        WHEN aos_products.NAME LIKE '%Oil%'
            THEN opportunities_cstm.final_sale_amount_c * .33
        WHEN aos_products.NAME LIKE '%Merchant Cash Advance%'
            THEN opportunities_cstm.final_sale_amount_c * .16
        WHEN aos_products.NAME LIKE '%WB%'
            THEN opportunities_cstm.final_sale_amount_c * .025
        WHEN aos_products.NAME LIKE '%Land Lease%'
            THEN opportunities_cstm.final_sale_amount_c * .625
        WHEN aos_products.NAME LIKE '%Petro%'
            THEN opportunities_cstm.final_sale_amount_c * .625
        ELSE opportunities_cstm.final_sale_amount_c
    END AS All_Time_Closed_Points,
    opportunities.amount,
    CASE 
        WHEN aos_products.NAME = 'LifeSure'
            THEN opportunities.amount
        WHEN aos_products.NAME LIKE '%SCF%'
            THEN opportunities.amount * .125
        WHEN aos_products.NAME LIKE '%(PAC)%'
            THEN opportunities.amount * .833
        WHEN aos_products.NAME LIKE '%Income Select%'
            AND aos_products.NAME NOT LIKE '%(PAC)%'
            THEN opportunities.amount * .166
        WHEN aos_products.NAME = 'Estate Enhancer'
            THEN opportunities.amount * .333
        WHEN aos_products.NAME LIKE '%Oil%'
            THEN opportunities.amount * .33
        WHEN aos_products.NAME LIKE '%Merchant Cash Advance%'
            THEN opportunities.amount * .16
        WHEN aos_products.NAME LIKE '%WB%'
            THEN opportunities.amount * .025
        WHEN aos_products.NAME LIKE '%Land Lease%'
            THEN opportunities.amount * .625
        WHEN aos_products.NAME LIKE '%Petro%'
            THEN opportunities.amount * .625
        ELSE opportunities.amount
    END AS All_Time_Submitted_Points
FROM wn_writing_number 
JOIN wn_writing_number_cstm ON wn_writing_number.id = wn_writing_number_cstm.id_c
JOIN preps_contracted_reps_wn_writing_number_1_c ON wn_writing_number_cstm.id_c = preps_contracted_reps_wn_writing_number_1wn_writing_number_idb
JOIN preps_contracted_reps ON preps_contracted_reps_wn_writing_number_1_c.preps_cont9effed_reps_ida = preps_contracted_reps.id
JOIN preps_contracted_reps_cstm ON preps_contracted_reps.id = preps_contracted_reps_cstm.id_c
LEFT JOIN opportunities_cstm ON preps_contracted_reps.id = opportunities_cstm.preps_contracted_reps_id1_c
LEFT JOIN opportunities ON opportunities.id = opportunities_cstm.id_c
LEFT JOIN aos_products ON opportunities_cstm.aos_products_id_c = aos_products.id
LEFT JOIN aos_products_cstm ON aos_products.id = aos_products_cstm.id_c
WHERE preps_contracted_reps_cstm.preps_contracted_reps_id_c = "zcrm_1130062000004859021" AND preps_contracted_reps.deleted = "0" AND contact_status_reps_c <> "Terminated" AND contact_status_reps_c <> "Declined"
GROUP BY preps_contracted_reps.id

编辑3:以下是每个代表拉动多个销售,但不是全部。 在每次销售的Num_Reps_in_Downline列中也放置了不同的数字或代表,这对我来说很有趣,因为我认为它将在所有行中放置相同的总数。

SELECT pcr.first_name AS Rep_First_Name,
    pcr.last_name AS Rep_Last_Name,
    pcrc.contact_status_reps_c AS Rep_Status,
    COUNT(wnc.id_c) AS Num_Reps_in_Downline,
    MAX(o.date_entered) AS Date_Entered,
    ap.name AS Product_Name,
    SUM(oc.final_sale_amount_c) AS Total_in_Dollars,
    CASE 
        WHEN ap.NAME = 'LifeSure'
            THEN oc.final_sale_amount_c
        WHEN ap.NAME LIKE '%SCF%'
            THEN oc.final_sale_amount_c * .125
        WHEN ap.NAME LIKE '%(PAC)%'
            THEN oc.final_sale_amount_c * .833
        WHEN ap.NAME LIKE '%Income Select%' AND ap.NAME NOT LIKE '%(PAC)%'
            THEN oc.final_sale_amount_c * .166
        WHEN ap.NAME = 'Estate Enhancer'
            THEN oc.final_sale_amount_c * .333
        WHEN ap.NAME LIKE '%Oil%'
            THEN oc.final_sale_amount_c * .33
        WHEN ap.NAME LIKE '%Merchant Cash Advance%'
            THEN oc.final_sale_amount_c * .16
        WHEN ap.NAME LIKE '%WB%'
            THEN oc.final_sale_amount_c * .025
        WHEN ap.NAME LIKE '%Land Lease%'
            THEN oc.final_sale_amount_c * .625
        WHEN ap.NAME LIKE '%Petro%'
            THEN oc.final_sale_amount_c * .625
        ELSE oc.final_sale_amount_c
    END AS All_Time_Closed_Points,
    CASE 
        WHEN ap.NAME = 'LifeSure'
            THEN o.amount
        WHEN ap.NAME LIKE '%SCF%'
            THEN o.amount * .125
        WHEN ap.NAME LIKE '%(PAC)%'
            THEN o.amount * .833
        WHEN ap.NAME LIKE '%Income Select%'
            AND ap.NAME NOT LIKE '%(PAC)%'
            THEN o.amount * .166
        WHEN ap.NAME = 'Estate Enhancer'
            THEN o.amount * .333
        WHEN ap.NAME LIKE '%Oil%'
            THEN o.amount * .33
        WHEN ap.NAME LIKE '%Merchant Cash Advance%'
            THEN o.amount * .16
        WHEN ap.NAME LIKE '%WB%'
            THEN o.amount * .025
        WHEN ap.NAME LIKE '%Land Lease%'
            THEN o.amount * .625
        WHEN ap.NAME LIKE '%Petro%'
            THEN o.amount * .625
        ELSE o.amount
    END AS All_Time_Submitted_Points
FROM wn_writing_number wn
JOIN wn_writing_number_cstm wnc ON wn.id = wnc.id_c
JOIN preps_contracted_reps_wn_writing_number_1_c pcrwn ON wnc.id_c = pcrwn.preps_contracted_reps_wn_writing_number_1wn_writing_number_idb
JOIN preps_contracted_reps pcr ON pcrwn.preps_cont9effed_reps_ida = pcr.id
JOIN preps_contracted_reps_cstm pcrc ON pcr.id = pcrc.id_c
LEFT JOIN opportunities_cstm oc ON pcr.id = oc.preps_contracted_reps_id1_c
LEFT JOIN opportunities o ON o.id = oc.id_c
LEFT JOIN aos_products ap ON oc.aos_products_id_c = ap.id
LEFT JOIN aos_products_cstm apc ON ap.id = apc.id_c
WHERE pcrc.preps_contracted_reps_id_c = "503c4c33-d6cb-677d-0f6a-5a6f8b7aa1cc" AND pcr.deleted = "0" AND contact_status_reps_c <> "Terminated" AND contact_status_reps_c <> "Declined"
GROUP BY pcr.id, ap.name
ORDER BY pcr.last_name, pcr.first_name

没有任何GROUP BY查询的简化版本。 查看它是否包含必需的记录。

SELECT pcr.first_name AS Rep_First_Name,
    pcr.last_name AS Rep_Last_Name,
    pcrc.contact_status_reps_c AS Rep_Status,
    --COUNT(wn_writing_number_cstm.id_c) AS Num_Reps_in_Downline,
    wn.id_c,
    --MAX(opportunities.date_entered) AS Date_Entered,
    o.date_entered,
    ap.name AS Product_Name,
    --SUM(opportunities_cstm.final_sale_amount_c) AS Total_in_Dollars,
    oc.final_sale_amount_c,
    CASE 
        WHEN ap.NAME = 'LifeSure'
            THEN oc.final_sale_amount_c
        WHEN ap.NAME LIKE '%SCF%'
            THEN oc.final_sale_amount_c * .125
        WHEN ap.NAME LIKE '%(PAC)%'
            THEN oc.final_sale_amount_c * .833
        WHEN ap.NAME LIKE '%Income Select%' AND ap.NAME NOT LIKE '%(PAC)%'
            THEN oc.final_sale_amount_c * .166
        WHEN ap.NAME = 'Estate Enhancer'
            THEN oc.final_sale_amount_c * .333
        WHEN ap.NAME LIKE '%Oil%'
            THEN oc.final_sale_amount_c * .33
        WHEN ap.NAME LIKE '%Merchant Cash Advance%'
            THEN oc.final_sale_amount_c * .16
        WHEN ap.NAME LIKE '%WB%'
            THEN oc.final_sale_amount_c * .025
        WHEN ap.NAME LIKE '%Land Lease%'
            THEN oc.final_sale_amount_c * .625
        WHEN ap.NAME LIKE '%Petro%'
            THEN oc.final_sale_amount_c * .625
        ELSE oc.final_sale_amount_c
    END AS All_Time_Closed_Points,
    o.amount,
    CASE 
        WHEN ap.NAME = 'LifeSure'
            THEN o.amount
        WHEN ap.NAME LIKE '%SCF%'
            THEN o.amount * .125
        WHEN ap.NAME LIKE '%(PAC)%'
            THEN o.amount * .833
        WHEN ap.NAME LIKE '%Income Select%'
            AND ap.NAME NOT LIKE '%(PAC)%'
            THEN o.amount * .166
        WHEN ap.NAME = 'Estate Enhancer'
            THEN o.amount * .333
        WHEN ap.NAME LIKE '%Oil%'
            THEN o.amount * .33
        WHEN ap.NAME LIKE '%Merchant Cash Advance%'
            THEN o.amount * .16
        WHEN ap.NAME LIKE '%WB%'
            THEN o.amount * .025
        WHEN ap.NAME LIKE '%Land Lease%'
            THEN o.amount * .625
        WHEN ap.NAME LIKE '%Petro%'
            THEN o.amount * .625
        ELSE o.amount
    END AS All_Time_Submitted_Points
FROM wn_writing_number wn
JOIN wn_writing_number_cstm wnc ON wn.id = wnc.id_c
JOIN preps_contracted_reps_wn_writing_number_1_c pcrwn ON wnc.id_c = pcrwn.preps_contracted_reps_wn_writing_number_1wn_writing_number_idb
JOIN preps_contracted_reps pcr ON pcrwn.preps_cont9effed_reps_ida = pcr.id
JOIN preps_contracted_reps_cstm pcrc ON pcr.id = pcrc.id_c
LEFT JOIN opportunities_cstm oc ON pcr.id = oc.preps_contracted_reps_id1_c
LEFT JOIN opportunities o ON o.id = oc.id_c
LEFT JOIN aos_products ap ON oc.aos_products_id_c = ap.id
LEFT JOIN aos_products_cstm apc ON ap.id = apc.id_c
WHERE pcrc.preps_contracted_reps_id_c = "zcrm_1130062000004859021" AND pcr.deleted = "0" AND contact_status_reps_c <> "Terminated" AND contact_status_reps_c <> "Declined"

以您的原始查询为起点,我的评论建议您需要转换成类似以下格式:

SUM (opportunities_cstm.final_sale_amount_c 
     * CASE 
        WHEN aos_products.NAME = 'LifeSure' THEN 1
        WHEN aos_products.NAME LIKE '%SCF%' THEN .125
        WHEN aos_products.NAME LIKE '%(PAC)%' THEN .833
        WHEN aos_products.NAME LIKE '%Income Select%'
            AND aos_products.NAME NOT LIKE '%(PAC)%' 
        THEN .166
        WHEN aos_products.NAME = 'Estate Enhancer' THEN .333
        WHEN aos_products.NAME LIKE '%Oil%' THEN .33
        WHEN aos_products.NAME LIKE '%Merchant Cash Advance%' THEN .16
        WHEN aos_products.NAME LIKE '%WB%' THEN .025
        WHEN aos_products.NAME LIKE '%Land Lease%' THEN .625
        WHEN aos_products.NAME LIKE '%Petro%' THEN .625
        ELSE 1 -- ???
       END
    ) AS All_Time_Closed_Points,

注意:我不太确定该ELSE 与以前一样,您将SUM表达式与平面字段引用混合在一起。

理想情况下(大多数RDBMS是必需的,并且是MySQL的最新默认配置),聚合查询的SELECT表达式应仅由分组值和聚合值组成。

如果您的SELECT包含CASE或任何逻辑,则该逻辑应基于分组的字段/值,或者该逻辑的结果应分组,或仅是汇总的结果(即SELECT CASE X WHEN 0 THEN MIN(y) ELSE MAX(y) END ... GROUP ON X )。

如果逻辑对合计结果进行运算,则仅应返回合计结果(即, SELECT CASE WHEN SUM(X) < 0 THEN MIN(Y) ELSE MAX(Y) END ... )。

如果逻辑在聚合函数中,则可以使用它来调整正在聚合的值(如上例中所示)。 不用说,您不能在这样的嵌套逻辑表达式中包含聚合值,而不能在一个聚合中嵌套另一个聚合值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM