一个group by的问题

走出一条新道路 2013-12-30 10:23:49

InSt_Amt=(select isnull(sum(x.Fc_tot), 0)
from StInPoOrdD x
inner join PoOrdD o on x.OrderD_Id = o.OrderD_Id where o.OrderM_Id = b.OrderM_Id)

如代码所示,我在存储过程中将此列查出,插入临时表,而且内表中也有聚合函数SUM,按理说应该不需要Group by,存储过程建立也是正确的,但是我只要一输入参数进行查询,就会报这个错:选择列表中的列 'StInPoOrdD.Fc_Tot' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
请问这是为什么?内表中的列外表是无法访问的,所以也没有办法进行GROUP BY,求大神指教
...全文
104 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2013-12-30
  • 打赏
  • 举报
回复
引用 12 楼 a01589 的回复:
[quote=引用 7 楼 DBA_Huangzj 的回复:] 你那个报错通常是select/order by /having里面用到了一些没有在聚合函数中的列,把完整的语句贴出来看看
赞同,应该是有这样的问题,不过这个存储过程比较复杂,貌似还调用了别的存储过程,所以我还是问问其他同事好了,先结贴了,谢谢版主大大[/quote]你单纯贴出的那部分其实没啥问题,所以需要看全部的代码(相关的)
  • 打赏
  • 举报
回复
引用 11 楼 laq616853363 的回复:
顶,我保证楼主会结贴的~
这个存储过程研究了一早上
  • 打赏
  • 举报
回复
引用 7 楼 DBA_Huangzj 的回复:
你那个报错通常是select/order by /having里面用到了一些没有在聚合函数中的列,把完整的语句贴出来看看
赞同,应该是有这样的问题,不过这个存储过程比较复杂,貌似还调用了别的存储过程,所以我还是问问其他同事好了,先结贴了,谢谢版主大大
Csharp_琪 2013-12-30
  • 打赏
  • 举报
回复
顶,我保证楼主会结贴的~
LongRui888 2013-12-30
  • 打赏
  • 举报
回复
引用 9 楼 a01589 的回复:
[quote=引用 5 楼 hwhmh2010 的回复:] 1.把你里头的 “isnull(sum(x.Fc_tot), 0)” 这个列值,重新命名一个别名,就可以了。 2.如果你select语句中查询只有聚合函数,没有其他列的话,不用group by,如果除了聚合函数,还有其他列,就要group by 了。
嗯,这个我知道的,没有聚合函数的列,我全部都group by了,只是这个列的子查询中,是有聚合函数的,但是还是提示需要group by,我就有点搞不清楚了[/quote] 你的意思是,你的整个语句有group by,然后这个子查询,由于有sum函数,但还是会报错的,应该还是需要用group by的,不过也不应该报这个错,应该是报 xx字段没有在group by中
  • 打赏
  • 举报
回复
引用 5 楼 hwhmh2010 的回复:
1.把你里头的 “isnull(sum(x.Fc_tot), 0)” 这个列值,重新命名一个别名,就可以了。 2.如果你select语句中查询只有聚合函数,没有其他列的话,不用group by,如果除了聚合函数,还有其他列,就要group by 了。
嗯,这个我知道的,没有聚合函数的列,我全部都group by了,只是这个列的子查询中,是有聚合函数的,但是还是提示需要group by,我就有点搞不清楚了
發糞塗牆 2013-12-30
  • 打赏
  • 举报
回复
引用 6 楼 a01589 的回复:
[quote=引用 2 楼 DBA_Huangzj 的回复:] 要加入别名,不然列名为null
求教版主大大,那“InSt_Amt=”不算是指定了列的名吗?或者说你的意思是,那个子查询里面是没有列名的[/quote]结果集里面要指定,就想: select * from (xxxx) 这个会报错的,因为from它不直达括号里面的是一个什么东西
發糞塗牆 2013-12-30
  • 打赏
  • 举报
回复
你那个报错通常是select/order by /having里面用到了一些没有在聚合函数中的列,把完整的语句贴出来看看
  • 打赏
  • 举报
回复
引用 2 楼 DBA_Huangzj 的回复:
要加入别名,不然列名为null
求教版主大大,那“InSt_Amt=”不算是指定了列的名吗?或者说你的意思是,那个子查询里面是没有列名的
山寨DBA 2013-12-30
  • 打赏
  • 举报
回复
1.把你里头的 “isnull(sum(x.Fc_tot), 0)” 这个列值,重新命名一个别名,就可以了。 2.如果你select语句中查询只有聚合函数,没有其他列的话,不用group by,如果除了聚合函数,还有其他列,就要group by 了。
  • 打赏
  • 举报
回复
引用 3 楼 yupeigu 的回复:
InSt_Amt=(select isnull(sum(x.Fc_tot), 0) from StInPoOrdD x inner join PoOrdD o on x.OrderD_Id = o.OrderD_Id where o.OrderM_Id = b.OrderM_Id) 这个应该是一个子查询,这个别名 b是从哪儿来的 b.OrderM_Id
噢,这只是其中一句,b是外表,我是为了关联写的,这问题里面是简写的SQL语句
LongRui888 2013-12-30
  • 打赏
  • 举报
回复
InSt_Amt=(select isnull(sum(x.Fc_tot), 0) from StInPoOrdD x inner join PoOrdD o on x.OrderD_Id = o.OrderD_Id where o.OrderM_Id = b.OrderM_Id) 这个应该是一个子查询,这个别名 b是从哪儿来的 b.OrderM_Id
發糞塗牆 2013-12-30
  • 打赏
  • 举报
回复
要加入别名,不然列名为null
IEEE_China 2013-12-30
  • 打赏
  • 举报
回复

InSt_Amt=(select isnull(sum(x.Fc_tot), 0)  as Fc_tot
                        from StInPoOrdD x
                          inner join PoOrdD o on x.OrderD_Id = o.OrderD_Id where o.OrderM_Id = b.OrderM_Id)
山寨DBA 2013-12-30
  • 打赏
  • 举报
回复
给你贴几个我实验的结果吧,你琢磨琢磨,希望对你有用:
山寨DBA 2013-12-30
  • 打赏
  • 举报
回复
引用 9 楼 a01589 的回复:
[quote=引用 5 楼 hwhmh2010 的回复:] 1.把你里头的 “isnull(sum(x.Fc_tot), 0)” 这个列值,重新命名一个别名,就可以了。 2.如果你select语句中查询只有聚合函数,没有其他列的话,不用group by,如果除了聚合函数,还有其他列,就要group by 了。
嗯,这个我知道的,没有聚合函数的列,我全部都group by了,只是这个列的子查询中,是有聚合函数的,但是还是提示需要group by,我就有点搞不清楚了[/quote] 这个这个,我也不晓得怎么给你解释了,你直接把下面的代码拷过去,执行下,然后琢磨琢磨,或许对你有所帮助吧。你这个代码里头首先“isnull(sum(x.Fc_tot), 0)” 这个没有给命名一个别名,这个应该是错误之一,因为没有列名,其他语句查询的时候不晓得这一列叫啥。

create table #temp(
	A varchar(10) null,
	b int null
)

insert into #temp
select 'Test',5 union 
select 'Test',1 union
select 'Test2',2

select A,SUM(b) as qty from #temp group by A
select SUM(b) as qty from #temp group by A
select SUM(b) as qty from #temp

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧