SQL计算COUNT的百分比

时间:2017-10-03 09:00:24

标签: sql count percentage

我在SQL

中有以下查询
    SELECT  
    ISNULL(Status,'Grand Total') as Status,
    COUNT(CASE WHEN pxCreateDateTime BETWEEN (GETDATE() - 30) AND GETDATE() THEN 1 END) AS b1,
    COUNT(CASE WHEN pxCreateDateTime BETWEEN (GETDATE() - 60) AND (GETDATE() - 30) THEN 1 END) AS b2,
    COUNT(CASE WHEN pxCreateDateTime BETWEEN (GETDATE() - 90) AND (GETDATE() - 60) THEN 1 END) AS b3
    FROM PRPC7.prpcdata.DLL_index_ContractMgtWork
    WHERE CaseType = 'Amortization Schedule DE'
    GROUP BY Status WITH ROLLUP

查询执行以下结果:

    Status              b1  b2  b3
    ------------------------------
    Open-LetterReview   1   7   11
    Open-RequestAMO     4   3   4
    Pending-ExceptionWB 0   2   10
    Resolved-Success    7   1   0
    Resolved-Withdrawn  0   0   0
    Grand Total         12  13  25 

我希望在总数上达到b1,b2,b3的%:

    Status              b1  b2  b3    %b1      %b2     %b3
    --------------------------------------------------------
    Open-LetterReview   1   7   11    8,3%     53,8%   44%
    Open-RequestAMO     4   3   4     33,3%    
    Pending-ExceptionWB 0   2   10    0% 
    Resolved-Success    7   1   0     58,3%
    Resolved-Withdrawn  0   0   0     0%
    Grand Total         12  13  25    100%

提前致谢〜

根据这篇文章的解决方案How to calculate percentage with a SQL statement似乎对我不起作用。我认为它与我使用“case when”的事实有关,如果我按照这个答案我的查询应该是这样的:

    SELECT  
    ISNULL(Status,'Grand Total') as Status,
    COUNT(CASE WHEN pxCreateDateTime BETWEEN (GETDATE() - 30) AND GETDATE() THEN 1 END) AS b1,
    (COUNT(CASE WHEN pxCreateDateTime BETWEEN (GETDATE() - 30) AND GETDATE() THEN 1 END) * 100 / (Select count(*) From PRPC7.prpcdata.DLL_index_ContractMgtWork)) as pct,
    COUNT(CASE WHEN pxCreateDateTime BETWEEN (GETDATE() - 60) AND (GETDATE() - 30) THEN 1 END) AS b2,
    COUNT(CASE WHEN pxCreateDateTime BETWEEN (GETDATE() - 90) AND (GETDATE() - 60) THEN 1 END) AS b3
    FROM PRPC7.prpcdata.DLL_index_ContractMgtWork
    WHERE CaseType = 'Amortization Schedule DE'
    GROUP BY Status WITH ROLLUP

    Status              b1 pct b2   b3
    ----------------------------------
    Open-LetterReview   1   0   7   11
    Open-RequestAMO 4   0   3   4
    Pending-ExceptionWB 0   0   2   10
    Resolved-Success    7   0   1   0
    Resolved-Withdrawn  0   0   0   0
    Grand Total         12  0   13  25 

1 个答案:

答案 0 :(得分:0)

这样的东西可能会给你输出,

WITH MY_DATA AS (
    SELECT  
    ISNULL(Status,'Grand Total') as Status,
    COUNT(CASE WHEN pxCreateDateTime BETWEEN (GETDATE() - 30) AND GETDATE() THEN 1 END) AS b1,
    COUNT(CASE WHEN pxCreateDateTime BETWEEN (GETDATE() - 60) AND (GETDATE() - 30) THEN 1 END) AS b2,
    COUNT(CASE WHEN pxCreateDateTime BETWEEN (GETDATE() - 90) AND (GETDATE() - 60) THEN 1 END) AS b3
    FROM PRPC7.prpcdata.DLL_index_ContractMgtWork
    WHERE CaseType = 'Amortization Schedule DE'
    GROUP BY Status WITH ROLLUP
)
SELECT Status, b1, 
b1 / (select b1 from MY_DATA where status = 'Grand Total'),
b2 / (select b2 from MY_DATA where status = 'Grand Total'), 
b3 / (select b3 from MY_DATA where status = 'Grand Total')
FROM MY_DATA