【问题标题】:Can I query a aggregated query and a specific row's query when using subqueries?使用子查询时可以查询聚合查询和特定行的查询吗?
【发布时间】:2021-05-26 03:01:02
【问题描述】:

我是 SQL 新手,我想返回特定值的结果和相似值的平均值。我已经得到了平均部分的工作,但我不确定如何做具体的价值部分。

如需更多背景信息,我有一份公司碳排放清单。我想要一个基于公司行业的行业平均值(在下面完美运行),但我不知道如何添加具体的公司信息。

这是我的查询:

SELECT
    year, AVG(carbon) AS AVG_carbon,
    --    carbon as CompanyCarbon, <--my not working attempt
FROM
    "company"."carbon" c 
WHERE
    LOWER(c.ticker) IN (SELECT LOWER(g4.ticker)
                        FROM "company"."General" g4
                        WHERE industry = (SELECT industry 
                                          FROM "company"."General" g3 
                                          WHERE LOWER(g3.ticker) = 'ibm.us')) 
GROUP BY 
    c.year
ORDER BY 
    year ASC;

目前的结果是:

year    avg_carbon
--------------------------------
1998    7909.0000000000000000
1999    19465.500000000000
2000    19478.000000000000
2001    182679.274509803922
2002    179821.156862745098

我想要的输出是:

year    avg_carbon.             Carbon
---------------------------------------
1998    7909.0000000000000000   343
1999    19465.500000000000      544
2000    19478.000000000000      653
2001    182679.274509803922     654
2002    179821.156862745098     644

(添加基于“IBM”碳的碳列

这是我的 Carbon 表:

ticker  year    carbon
-----------------------
hurn.us 2016    6282
hurn.us 2015    6549
hurn.us 2014    5897
hurn.us 2013    5300
hurn.us 2012    5340
ibm.us  2019    1496520
ibm.us  2018    1438365

根据我有限的知识,我认为我的陈述是在哪里引起问题的。现在我在一家公司工作,获取同一行业的代码/标识符列表,然后创建每年的平均值。

我试图只调用碳列,但我认为因为它正在处理代码列表,所以它没有输出我想要的结果。

我能做什么?另外,如果我犯了您在上面看到的任何其他错误,请告诉我。

【问题讨论】:

  • 样本数据和期望的结果会非常丰富。
  • 嗨@GordonLinoff 我已经添加了它,但它在中间。我会更新,所以它被标记为所需的输出
  • 第一行结果碳是 343。第二列是 544。请解释背后的逻辑。

标签: sql postgresql


【解决方案1】:

样本数据和输出不匹配。所以我不能肯定地说,但这可能是您正在寻找的答案。

select year, AVG(carbon) AS AVG_carbon,
max(case when lower(ticker)  = 'ibm.us' then carbon else 0 end) as CompanyCarbon
from "company"."carbon" c 
GROUP BY c.year
order by year ASC;

如果 lower(ticker) = 'ibm.us',这将选择任何年份的 max(carbon) 作为 CompanyCarbon。将按照您的方式计算平均值。

仅选择 CompanyCarbon 列中具有正值的行:

select year, AVG_carbon, CompanyCarbon
from 
(
    select year, AVG(carbon) AS AVG_carbon,
    max(case when lower(ticker)  = 'ibm.us' then carbon else 0 end) as   CompanyCarbon
    from "company"."carbon" c 
    GROUP BY c.year
    order by year ASC;
)t where carbon > 0

【讨论】:

  • 谢谢,成功了!我没有想到select语句中的子查询。谢谢
  • 奇怪的问题,有没有办法让 CompanyCarbon 不为空?
  • 我添加了 else 部分来产生 0 而不是 null。
  • 不客气@Lostsoul。最良好的祝愿。
  • 谢谢,我的意思是根本不显示该行..不要用 0 填充它。
【解决方案2】:

类似于 Kazi 提供的答案,您可以在聚合上使用 FILTER 语法,这使其比 case/when IMO 更具可读性。

SELECT 
   year, 
   AVG(carbon) as avg_carbon, 
   MAX(carbon) FILTER (WHERE ticker = 'ibm.us') as company_carbon 
FROM company_carbon 
GROUP BY year 
ORDER by year;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 2021-09-21
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多