2012-10-24 63 views
1

我需要生成基于以下表格报告:如何写一个SQL查询来生成报告

CALLS_FOR_PROPOSALS 

ID|Name 
--+------ 
1|Call 1 
2|Call 2 
3|Call 3 


PROPOSALS 

ID|Call ID|Title 
--+-------+---------- 
1|  1|Proposal 1 
2|  2|Proposal 2 
3|  2|Proposal 3 


PROPOSAL_STATUSES 

ID|Proposal ID|Status ID 
--+-----------+--------- 
1|   1|  1 
2|   2|  1 
3|   3|  1 
4|   3|  2 


STATUSES 

ID|NAME 
--+------------ 
1|Not Reviewed 
2|Processing 
3|Accepted 
4|Rejected 

有了这个样本数据,有3个项目征集。有三个建议;一个用于呼叫1,另一个用于呼叫2.(呼叫3没有任何提议。)每个提议至少有一个状态分配给它。将行插入PROPOSALS表时,会将相应的行插入到PROPOSAL_STATUSES中,从而使Proposal的初始默认状态为1(未评论)。每次状态更改时,都会在PROPOSAL_STATUSES表中插入一个新行,以便保留状态更改的历史记录。我需要为每个呼叫生成一份报告,显示已提交的提案数量以及已有多个状态的提案的数量(即状态已从默认状态至少更改过一次)。对于上述示例数据,结果将如下所示:

Call Name|Proposals Submitted|Proposals Reviewed| 
---------+-------------------+------------------+ 
Call 1 |     1|     0| 
Call 2 |     2|     1| 
Call 3 |     0|     0| 

如何根据上述表结构编写SQL查询以生成此报表?谢谢你的帮助。

回答

1

这样的事情应该做的伎俩:Demo

SELECT Name as 'Call name', 
     submitted as 'Proposals Submitted', 
     SUM(CASE WHEN maxStatus > 1 THEN 1 ELSE 0 END) as 'Proposals Reviewed' 
FROM 
    (SELECT cfp.Name, 
    sum(case when ps.Status_ID = 1 then 1 else 0 end) as submitted, 
    MAX(ps.Status_ID) as maxStatus 
    FROM CALLS_FOR_PROPOSALS cfp 
    LEFT JOIN PROPOSALS p on cfp.ID = p.CALL_ID 
    LEFT JOIN PROPOSAL_STATUSES ps on ps.PROPOSAL_ID = p.ID 
    GROUP BY cfp.Name) AS s 

GROUP BY Name, submitted 
+0

谢谢,我感谢您的帮助! – jg8273