如何获得每天2列总计数的百分比?

时间:2017-11-23 20:10:30

标签: sql hadoop

我有以下查询:

SELECT ACCT_OT, 

COUNT(CASE WHEN BR_CD like '%0%' THEN 1 ELSE NULL END) AS new,

COUNT(CASE WHEN BR_CD like '%1%' THEN 1 ELSE NULL END) AS old,

FROM MSTR_TBL where ACCT_OT between '2017-10-23' and '2017-10-25'

GROUP BY ACCT_OT;

我希望能够在同一查询中添加另一列,其中显示旧/新的百分比。例如,在10/23,new是10,old是1,那么第三列将是10%。希望你们能帮忙。

4 个答案:

答案 0 :(得分:0)

可能使用公用表表达式。像这样:

WITH CTE AS (SELECT ACCT_OT, 

    COUNT(CASE WHEN BR_CD like '%0%' THEN 1 ELSE NULL END) AS new,

    COUNT(CASE WHEN BR_CD like '%1%' THEN 1 ELSE NULL END) AS old,

    FROM MSTR_TBL where ACCT_OT between '2017-10-23' and '2017-10-25'

    GROUP BY ACCT_OT;
)
SELECT ACCT_OT, new, old, ((old/new) * 100) AS per FROM CTE;

答案 1 :(得分:0)

我不确定这是否有效,因为我无法测试,但你可以试试。

SELECT ACCT_OT, COUNT(CASE WHEN BR_CD like '%0%' THEN 1 ELSE NULL END) AS new, COUNT(CASE WHEN BR_CD like '%1%' THEN 1 ELSE NULL END) AS old, CONVERT(VARCHSR(50), COUNT(CASE WHEN BR_CD like '%1%' THEN 1 ELSE NULL END) * 100 / COUNT(CASE WHEN BR_CD like '%0%' THEN 1 ELSE NULL END))+'% ' as percentage FROM MSTR_TBL where ACCT_OT between '2017-10-23' and '2017-10-25' GROUP BY ACCT_OT;

答案 2 :(得分:0)

你可以这样做

WITH v_mstr_tbl
AS
(SELECT  ACCT_OT, 
        COUNT(CASE WHEN BR_CD like '%0%' THEN 1 ELSE NULL END) AS new,
        COUNT(CASE WHEN BR_CD like '%1%' THEN 1 ELSE NULL END) AS old
 FROM   MSTR_TBL where ACCT_OT between '2017-10-23' and '2017-10-25'
 GROUP BY ACCT_OT
 )
 SELECT ACCT_OT, new, old, (new/old) * 100 AS percent
   FROM v_mstr_tbl;

答案 3 :(得分:0)

我会使用sum()代替count()编写您的查询:

SELECT ACCT_OT, 
       SUM(CASE WHEN BR_CD like '%0%' THEN 1 ELSE 0 END) AS new,
       SUM(CASE WHEN BR_CD like '%1%' THEN 1 ELSE 0 END) AS old
FROM MSTR_TBL 
WHERE ACCT_OT BETWEEN '2017-10-23' ND '2017-10-25'
GROUP BY ACCT_OT;

如果您希望百分比旧,我会这样做:

SELECT ACCT_OT, 
       SUM(CASE WHEN BR_CD like '%0%' THEN 1 ELSE 0 END) AS new,
       SUM(CASE WHEN BR_CD like '%1%' THEN 1 ELSE 0 END) AS old,
       AVG(CASE WHEN BR_CD like '%1%' THEN 1.0 ELSE 0 END) AS old
FROM MSTR_TBL 
WHERE ACCT_OT BETWEEN '2017-10-23' ND '2017-10-25'
GROUP BY ACCT_OT;

然而,该比率需要重复表达式:

SELECT ACCT_OT, 
       SUM(CASE WHEN BR_CD like '%0%' THEN 1 ELSE 0 END) AS new,
       SUM(CASE WHEN BR_CD like '%1%' THEN 1 ELSE 0 END) AS old,
       (SUM(CASE WHEN BR_CD like '%1%' THEN 1 ELSE 0 END) /
        SUM(CASE WHEN BR_CD like '%0%' THEN 1 END)
       ) as ratio

我删除了else 0以避免被零除。