我有一个查询,我试图根据用户的ID来拉动我们公司的销售额。它将他们的姓/名,他们的状态,代表在他们的下线和最近的销售中输入。然后它应该为所有销售提取美元金额并将它们加在一起(注意:此列后来被添加为销售部门的临时修复)。然后,对于每次销售,它应该将美元价值转换为基于产品的点值。它还应该找到销售的总提交值和总关闭点值。我每个销售人员只需要一排。
以下是查询的当前迭代:
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_Points
和All_Time_Submitted_Points
列中获得不同的数字。
我搜索了几个论坛并发现了一些关于它与群组问题的建议,但是当我尝试调整群组时,通常只返回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
答案 0 :(得分:0)
您的查询的简化版本没有任何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"
答案 1 :(得分:0)
以原始查询为起点,我的意见建议你需要转换为类似这样的格式:
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 ...
)。
如果逻辑在聚合函数内,则可以用它来调整聚合的值(如上例所示)。不言而喻,您不能在这样的嵌套逻辑表达式中包含聚合值,只能将一个聚合嵌套在另一个聚合中。