sql - 如何编写 SQL 查询来生成报告

标签 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 中,从而为提案提供初始默认状态 1(未审核)。每次状态更改时,都会将新行插入到 PROPOSAL_STATUSES 表中,以便保留状态更改的历史记录。我需要生成一份报告,显示每次调用、提交的提案数量以及具有多个状态的提案数量(即状态已从默认状态至少更改一次。)对于上面的示例数据,结果将如下所示:

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

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

最佳答案

类似的东西应该可以解决问题: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

关于sql - 如何编写 SQL 查询来生成报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13052209/

相关文章:

sql - 删除 SQL Server 2005 中的条目 - 将 varchar 值转换为数据类型 int 时转换失败

mysql - 缓慢的存储过程 - SQL Server

Python 在每一列中计数和分组 0's and 1' s

mysql - 在mysql中插入和更新

MySQL/ASP 分页,COUNT 与 LIMIT

sql - 大整数系列的优化存储

sql 在子集中创建序列号 - apache derby

sql - 为什么包含某些字母的 SQL 查询的某些结果丢失了?

sql - 我什么时候应该在 PL/SQL 中使用过程或函数?

mysql - 我怎么知道 ssl 正在 mysql 复制中使用?