【问题标题】:How to create new column based on arithmetic operation after doing GROUP BY执行 GROUP BY 后如何基于算术运算创建新列
【发布时间】:2021-08-03 22:06:58
【问题描述】:

我有一个语法问题。我正在尝试 Anthony DeBarros 的“Practical SQL”一书中的练习。我进行了练习,其中涉及创建两个新列,这些列基于来自两个不同数据集的四列创建百分比变化。下面的查询运行良好:

SELECT pls14.stabr AS us_state, 
       sum(pls14.gpterms) AS terminals_2014,
       sum(pls09.gpterms) AS terminals_2009,
       round( (CAST(sum(pls14.gpterms) AS decimal(10,1)) - sum(pls09.gpterms)) /
                    sum(pls09.gpterms) * 100, 2 ) AS terminal_pct_change,
        sum(pls14.pitusr) AS term_uses_2014,
       sum(pls09.pitusr) AS term_uses_2009,
       round( (CAST(sum(pls14.pitusr) AS decimal(10,1)) - sum(pls09.pitusr)) /
                    sum(pls09.pitusr) * 100, 2 ) AS term_uses_pct_change
FROM pls_fy2014_pupld14a pls14 JOIN pls_fy2009_pupld09a pls09
ON pls14.fscskey = pls09.fscskey
WHERE pls14.gpterms >= 0 AND pls09.gpterms >= 0
GROUP BY pls14.stabr
ORDER BY terminal_pct_change DESC;

结果如下表:

us_state terminals_2014 terminals_2009 terminal_pct_change term_uses_2014 term_uses_2009 term_uses_pct_change
"GU"    547      59     827.12  39842   19564   103.65
"DC"    1000    594     68.35   1050623 140251  649.10
"AK"    994     618     60.84   771075  1061498 -27.36
"DE"    772     487     58.52   622515  451689  37.82
"ID"    1792    1151    55.69   1878131 1986141 -5.44
"CO"    6407    4172    53.57   7395748 7672580 -3.61

我想添加一个列,向我展示terminal_pct_changeterm_use_pct_change 列之间的简单区别。我尝试了很多东西,但没有任何效果。我不确定在哪里插入以下行。

terminal_pct_change - term_uses_pct_change AS kept_up

我很想 a) 让这个工作,但更重要的是 b) 了解解决方案的工作原理。

谢谢!

【问题讨论】:

  • 重复表达式、使用子查询或使用 CTE。
  • 不可能在同一 SELECT 子句中重用来自 SELECT 子句的列别名。如果您将另一个选择包装在您的语句周围,您可以引用别名(您的语句成为子选择,您可以像访问表格一样在此位置访问)。

标签: sql postgresql group-by


【解决方案1】:

试试这个

select x.us_state,x.terminals_2014,x.terminals_2009,(x.terminal_pct_change - x.term_uses_pct_change) AS kept_up,term_uses_2014,term_uses_2009 from (
SELECT pls14.stabr AS us_state, 
       sum(pls14.gpterms) AS terminals_2014,
       sum(pls09.gpterms) AS terminals_2009,
       round( (CAST(sum(pls14.gpterms) AS decimal(10,1)) - sum(pls09.gpterms)) /
                    sum(pls09.gpterms) * 100, 2 ) AS terminal_pct_change,
        sum(pls14.pitusr) AS term_uses_2014,
       sum(pls09.pitusr) AS term_uses_2009,
       round( (CAST(sum(pls14.pitusr) AS decimal(10,1)) - sum(pls09.pitusr)) /
                    sum(pls09.pitusr) * 100, 2 ) AS term_uses_pct_change
FROM pls_fy2014_pupld14a pls14 JOIN pls_fy2009_pupld09a pls09
ON pls14.fscskey = pls09.fscskey
WHERE pls14.gpterms >= 0 AND pls09.gpterms >= 0
GROUP BY pls14.stabr
ORDER BY terminal_pct_change DESC)x ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2016-05-21
    • 2016-04-14
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    相关资源
    最近更新 更多