【问题标题】:How to structure subqueries/CTEs to replace nested aggregate functions?如何构建子查询/CTE 以替换嵌套聚合函数?
【发布时间】:2019-07-29 16:21:15
【问题描述】:

我试图找出“amt”值的百分比属于每个“百分比”存储桶。

示例数据:

amt | pct
5   | .5
10  | .6
15  |  1
20  | .8

期望的结果:

pctAMT | PCTrange
.3     | <65
.4     | 75-84
.3     | 100+

我尝试过使用嵌套聚合函数,也尝试将总计用作单个值。但是,我遇到了错误。我想我必须将查询重新构建为 CTE 或子查询,但我不确定如何。

SELECT SUM(amt)/(SUM(amt) OVER()) AS pctAMT,
CASE WHEN percent < .65 then '  <65'
            WHEN .65 <= percent AND percent <.75  then '65-74'
            WHEN .75 <= percent AND percent <.85  then '75-84'
            WHEN .85 <= percent AND percent <.95  then '85-94'
            WHEN .95 <= percent AND percent <1.00 then '95-99'
            WHEN .100 <= percent  then ' 100+'
        END PCTrange
FROM table
WHERE date = TO_DATE('2016-04-01','YYYY-MM-DD')
GROUP BY PCTrange
ORDER BY PCTrange;

ERROR [HY000] ERROR:  Attribute LN_HIST.LN_FNCL_RPTG_UPB must be GROUPed or used in an aggregate function

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。你的错误看起来像 Netezza,所以我添加了那个标签。

标签: sql netezza


【解决方案1】:

我希望是这样的:

SELECT (CASE WHEN percent < 0.65 then '  <65'
             WHEN percent < 0.75 then '65-74'
             WHEN percent < 0.85 then '75-84'
             WHEN percent < 0.95 then '85-94'
             WHEN percent < 1.00 then '95-99'
             ELSE ' 100+'
        END) as PCTrange,
       SUM(amt)/ SUM(SUM(amt)) OVER () AS pctAMT
FROM table
WHERE date = '2016-04-01'
GROUP BY PCTrange
ORDER BY PCTrange;

重要的变化是SUM(SUM()) -- 将除法的总和相加。

我还简化了CASE 表达式。这些子句按顺序进行评估,因此您可以利用它。日期比较也比较简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 2017-12-15
    相关资源
    最近更新 更多