2012-06-07 61 views
2

好吧,我正在使用嵌套的SQL语句: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个单独记录的单行计数。如果用户id我组,我得到的用户建议的计数,但现在我没有为以后的过滤个人记录。

有几个方法我能想到的解决这个问题,但他们都吸。我可以做另一个查询,但这不够好,对我的输出结果不太好。

数据库是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 
+0

提供用于问题复制目的的已用表的模式是否太麻烦了?谢谢。 – hannebaumsaway

回答

1

试试这个:

SELECT 
    Count(*) as 'Total Proposals', 
    SUM(CASE WHEN status = 'complete' or status = 'contract' THEN 1 ELSE 0 END) as 'Total Contracts', 
    CASE userId 
     WHEN '4' THEN 'AT' 
     WHEN '3' THEN 'EO' 
     WHEN '11' THEN 'CT' 
     WHEN '13' THEN 'MH' 
     ELSE userId 
    END AS Salesman, 
    SUM(CASE WHEN status = 'complete' or status = 'contract' THEN contractAmt ELSE 0 END) as 'Contract Total', 
    AVG(DATEDIFF(contractDate, proposalDate)) AS averageDays, 
    SUM(proposalAmt) as pTot, 
    (SUM(CASE WHEN status = 'complete' or status = 'contract' THEN contractAmt ELSE 0 END)/SUM(proposalAmt)) AS 'Hit Rate $s', 
    (SUM(CASE WHEN status = 'complete' or status = 'contract' THEN 1 ELSE 0 END)/Count(*)) AS 'Hit Rate #s' 
FROM 
    (/* This inner loop only selects the top 100 records */ 
    select * FROM project 
    WHERE (status != 'proposal' and status != 'lead') and userId = '13' 
    order by contractDate DESC 
    LIMIT 0, 30) A 
GROUP BY userId 

我能想出的答案是不过滤使用WHERE子句,但使用CASE子句来筛选有合同的记录。无论您需要合同总额,您都需要这样做,您必须将合同金额过滤为仅限于具有您的身份的合同金额。 (除非你的数据库已经处理了这个问题。)

Total Proposals | Total Contracts | Salesman | Contract Total | averageDays | pTot | Hit Rate $s | Hit Rate #s 
30    15    MH   160496   46.8   324122 0.4952  0.5