好的,我正在使用嵌套的 SQL 语句:
我想查询我们的销售人员最近写的 120 条提案。我正在使用嵌套查询从系统中获取最后 120 个提案,然后根据状态等过滤它们......
我遇到的问题是如何获得每个推销员的提案数量?
SQL 显然是错误的,但这就是我卡住的地方。
SELECT
CASE userId
WHEN '4' THEN 'AT'
WHEN '3' THEN 'EO'
WHEN '11' THEN 'CT'
WHEN '13' THEN 'MH'
ELSE userId
END AS Salesman,
SUM(contractAmt) as 'Contract Total',
AVG(DATEDIFF(contractDate, proposalDate)) AS averageDays,
SUM(proposalAmt) as pTot,
Count(*) as Contracts,
Count(A.proposalAmt) as Proposals,
(SUM(contractAmt) / SUM(proposalAmt)) AS 'Hit Rate $s',
(Count(*) / Count(A.proposalAmt)) AS 'Hit Rate #s'
FROM
( /* Get the last 120 proposals not in Lead or Proposal status*/
SELECT contractAmt, proposalAmt, contractDate, status, userId,
CASE WHEN proposalDate = '0000-00-00'
THEN CAST(contractDate as Date)
else CAST(proposalDate as Date)
END as proposalDate
FROM project
WHERE (status != 'proposal' and status != 'lead')
/*GROUP BY id*/
ORDER BY contractDate DESC
LIMIT 0, 120) A
WHERE status = 'contract' or status = 'complete'
GROUP BY userId
“Count(A.proposalAmt) as Proposals”,这给了我过滤后的记录数。(仅限合同和已完成的订单)
在嵌套位中,查询不希望返回包含 100 条单独记录的单行计数。如果我按 userId 分组,我会按用户获得提案计数,但现在我没有单独的记录供以后过滤。
我可以想到几种方法来解决这个问题,但它们都很糟糕。我可以只做另一个查询,但这很不雅,而且我的输出效果不佳。
数据库是MySql。
如果我没有正确解释它的工作流程:
For each user ID
Get the last 100 proposals
Count # of proposals by salesman
Total proposal $ amount by salesman
Count # of contract or complete proposals
Total $ amount of contract and complete jobs
# proposals / # contracts = Hit Rate #'s
$ proposals / $ contracts = Hit Rate $'s
AVERAGE(contract date - proposal date) = Average # days in process
输出应类似于:
Salesman Avg Days ProposalTot ContractTot HR $'s Prop # Con # HR#'s -------------------------------------------------------------------------------------- EO | 29.27 | $30,000 | $15,000 | 50% | 30 | 15 | 50%
编辑:添加架构
Table project
=============
id, userId, clientId, contactId, projectName, status, description, creationDate, shipDate, estimateAmt, leadAmt, reestimateAmt, proposalAmt, contractAmt, completeAmt, type, subType, estDate, reestDate, proposalDate, contractDate, completeDate, lostDate, onHoldDate, estShip, reestShip, proposalShip, contractShip, completeShip, casperLink, statusChangeTS
-------------
id int(11) PK
userId int(11)
clientId int(11)
contactId int(11)
projectName varchar(255)
status enum('lead','proposal','contract','complete','onHold','lost')
description text
creationDate date
shipDate date
estimateAmt int(11)
leadAmt int(11)
reestimateAmt int(11)
proposalAmt int(11)
contractAmt int(11)
completeAmt int(11)
type varchar(100)
subType varchar(100)
estDate date
reestDate date
proposalDate date
contractDate date
completeDate date
lostDate date
onHoldDate date
estShip date
reestShip date
proposalShip date
contractShip date
completeShip date
casperLink varchar(20)
statusChangeTS date