SQL查询股票收盘价报错:列未在聚合函数或GROUP BY子句中
问题排查与解决方法
问题根源分析
第一个SQL的逻辑错误
你用UNION拼接IBM和GLD的查询结果,最终会得到两行数据(一行对应IBM,一行对应GLD),完全没法实现「同一日期下两个收盘价并列显示」的需求。另外表名写了Table,这是SQL关键字,应该替换为实际表名TS_DailyData。第二个SQL的语法错误
添加GROUP BY Date后,SELECT中的[Close]既没被包含在GROUP BY子句里,也没使用聚合函数(比如MAX()/MIN()),这违反了SQL分组规则——分组后,查询列要么是分组键,要么是经过聚合计算的结果,因此触发了报错。而且逻辑上依然没解决「同一行显示两个收盘价」的核心需求。
正确的SQL写法
要实现同一日期下IBM和GLD收盘价并列显示,推荐两种方案:
方法1:自连接(适合仅关联两个股票的场景)
SELECT ibm.Date, ibm.[Close] AS IBM_Close, gld.[Close] AS GLD_Close FROM TS_DailyData ibm JOIN TS_DailyData gld ON ibm.Date = gld.Date WHERE ibm.Ticker = 'IBM' AND gld.Ticker = 'GLD';
把同一张表分别当作IBM数据表和GLD数据表,通过Date字段关联,直接取出同一日期下两个股票的收盘价。
方法2:条件聚合(适合后续扩展多个股票的场景)
SELECT Date, MAX(CASE WHEN Ticker = 'IBM' THEN [Close] END) AS IBM_Close, MAX(CASE WHEN Ticker = 'GLD' THEN [Close] END) AS GLD_Close FROM TS_DailyData WHERE Ticker IN ('IBM', 'GLD') GROUP BY Date;
用CASE语句筛选对应股票的收盘价,再通过MAX()聚合(同一日期同一股票仅一条数据,聚合不影响结果),最后按Date分组,即可得到每行对应日期的两个收盘价。
内容的提问来源于stack exchange,提问作者lee
相关产品推荐
相关产品推荐

