T-SQL问题:Count()时提示“列未在聚合函数或Group By中”

时间:2022-06-10 11:34:27
                 SELECT [ProductionTasks].[ptID]
 ,[ProductionTasks].[wsID]
         ,[ptStyleNo]
 ,[ptStyle]
 ,[ptAmount]
 ,[ptDueDate]
 ,[ptCreatorID]
 ,[ptModifyID]
         ,[ptStatus]
 ,[ptCreationDate]
 ,Processes.*
 ,ProductionTaskItems.*
 ,Count(ProductionTaskItems.ptiID) as ItemCount
  FROM [ProductionTasks]
  LEFT JOIN ProductionTaskItems
  ON [ProductionTasks].ptID=ProductionTaskItems.ptID
  LEFT JOIN Processes
  ON Processes.pID=ProductionTaskItems.ptID

16 个解决方案

#1


有分组函数时,查询的列必须要包括在聚合函数或者分组里,这是语法规定,oracle和server一样!
建议:把其它没有count的列加上不影响取值的聚合函数,比如说min,max,因为你查出来也是固定的,加上也没影响。或者就把没有count的列写到group by里。

#2


语法错了,有count后边得有group by 啊

#3


group by 要把非聚合函数以外的字段都列进去。

#4


引用 1 楼 mr_graceless 的回复:
有分组函数时,查询的列必须要包括在聚合函数或者分组里,这是语法规定,oracle和server一样!
建议:把其它没有count的列加上不影响取值的聚合函数,比如说min,max,因为你查出来也是固定的,加上也没影响。或者就把没有count的列写到group by里。

我试了一下还是不行。具体怎么写还请示例,麻烦了~

#5


帮助文档那么清楚都不看啊

#6


这个很简单 遇到过的就知道 count();改成count 就可以了

#7


SELECT [ProductionTasks].[ptID]
,[ProductionTasks].[wsID]
,[ptStyleNo]
,[ptStyle]
,[ptAmount]
,[ptDueDate]
,[ptCreatorID]
,[ptModifyID]
,[ptStatus]
,[ptCreationDate]
,Processes.*
,ProductionTaskItems.*
,Count(ProductionTaskItems.ptiID) as ItemCount
FROM [ProductionTasks]
LEFT JOIN ProductionTaskItems
ON [ProductionTasks].ptID=ProductionTaskItems.ptID
LEFT JOIN Processes
ON Processes.pID=ProductionTaskItems.ptID
group by [ProductionTasks].[ptID]
,[ProductionTasks].[wsID]
,[ptStyleNo]
,[ptStyle]
,[ptAmount]
,[ptDueDate]
,[ptCreatorID]
,[ptModifyID]
,[ptStatus]
,[ptCreationDate]
,Processes.*
,ProductionTaskItems.*(*都要填满)


#8


按7楼的写法,Group By后面写的参数太多了 有没有简化的办法?

#9


先想清楚你要的是什么的count

#10


Count pitID 。  只是这样 我不清楚还要怎么描述 需要清楚些什么 

#11


引用 8 楼 huaier200 的回复:
按7楼的写法,Group By后面写的参数太多了 有没有简化的办法?

原理:用子查询来代替count()函数,没测,应该行,不过效率会降低,如果数据量小的话问题不大,不要偷懒,group by才是应该的。

SELECT [ProductionTasks].[ptID]
,[ProductionTasks].[wsID]
,[ptStyleNo]
,[ptStyle]
,[ptAmount]
,[ptDueDate]
,[ptCreatorID]
,[ptModifyID]
,[ptStatus]
,[ptCreationDate]
,Processes.*
,ProductionTaskItems.*
,(select Count(ProductionTaskItems.ptiID) FROM [ProductionTasks]
LEFT JOIN ProductionTaskItems
ON [ProductionTasks].ptID=ProductionTaskItems.ptID
LEFT JOIN Processes
ON Processes.pID=ProductionTaskItems.ptID) as ItemCount
FROM [ProductionTasks]
LEFT JOIN ProductionTaskItems
ON [ProductionTasks].ptID=ProductionTaskItems.ptID
LEFT JOIN Processes
ON Processes.pID=ProductionTaskItems.ptID

#12



SELECT [ProductionTasks].[ptID]
,[ProductionTasks].[wsID]
,[ptStyleNo]
,[ptStyle]
,[ptAmount]
,[ptDueDate]
,[ptCreatorID]
,[ptModifyID]
,[ptStatus]
,[ptCreationDate]
,Processes.*
,ProductionTaskItems.*
,Count(ProductionTaskItems.ptiID) as ItemCount
FROM [ProductionTasks]
LEFT JOIN ProductionTaskItems
ON [ProductionTasks].ptID=ProductionTaskItems.ptID
LEFT JOIN Processes
ON Processes.pID=ProductionTaskItems.ptID group by ItemCount

#13


引用 12 楼 kingdom_0 的回复:
SQL code

SELECT [ProductionTasks].[ptID]
,[ProductionTasks].[wsID]
,[ptStyleNo]
,[ptStyle]
,[ptAmount]
,[ptDueDate]
,[ptCreatorID]
,[ptModifyID]
,[ptStatus]
,[ptCreationDate]
,Processes.*
,Producti……

运行提示“列名ItemCount无效”

#14


引用 1 楼 mr_graceless 的回复:
有分组函数时,查询的列必须要包括在聚合函数或者分组里,这是语法规定,oracle和server一样!
建议:把其它没有count的列加上不影响取值的聚合函数,比如说min,max,因为你查出来也是固定的,加上也没影响。或者就把没有count的列写到group by里。


++

#15


你把表结构贴出来,给出测试数据,及想要的结果,不然没法回答你

#16


引用 6 楼 zyh86102373 的回复:
这个很简单 遇到过的就知道 count();改成count 就可以了

具体怎么做呢? 

#1


有分组函数时,查询的列必须要包括在聚合函数或者分组里,这是语法规定,oracle和server一样!
建议:把其它没有count的列加上不影响取值的聚合函数,比如说min,max,因为你查出来也是固定的,加上也没影响。或者就把没有count的列写到group by里。

#2


语法错了,有count后边得有group by 啊

#3


group by 要把非聚合函数以外的字段都列进去。

#4


引用 1 楼 mr_graceless 的回复:
有分组函数时,查询的列必须要包括在聚合函数或者分组里,这是语法规定,oracle和server一样!
建议:把其它没有count的列加上不影响取值的聚合函数,比如说min,max,因为你查出来也是固定的,加上也没影响。或者就把没有count的列写到group by里。

我试了一下还是不行。具体怎么写还请示例,麻烦了~

#5


帮助文档那么清楚都不看啊

#6


这个很简单 遇到过的就知道 count();改成count 就可以了

#7


SELECT [ProductionTasks].[ptID]
,[ProductionTasks].[wsID]
,[ptStyleNo]
,[ptStyle]
,[ptAmount]
,[ptDueDate]
,[ptCreatorID]
,[ptModifyID]
,[ptStatus]
,[ptCreationDate]
,Processes.*
,ProductionTaskItems.*
,Count(ProductionTaskItems.ptiID) as ItemCount
FROM [ProductionTasks]
LEFT JOIN ProductionTaskItems
ON [ProductionTasks].ptID=ProductionTaskItems.ptID
LEFT JOIN Processes
ON Processes.pID=ProductionTaskItems.ptID
group by [ProductionTasks].[ptID]
,[ProductionTasks].[wsID]
,[ptStyleNo]
,[ptStyle]
,[ptAmount]
,[ptDueDate]
,[ptCreatorID]
,[ptModifyID]
,[ptStatus]
,[ptCreationDate]
,Processes.*
,ProductionTaskItems.*(*都要填满)


#8


按7楼的写法,Group By后面写的参数太多了 有没有简化的办法?

#9


先想清楚你要的是什么的count

#10


Count pitID 。  只是这样 我不清楚还要怎么描述 需要清楚些什么 

#11


引用 8 楼 huaier200 的回复:
按7楼的写法,Group By后面写的参数太多了 有没有简化的办法?

原理:用子查询来代替count()函数,没测,应该行,不过效率会降低,如果数据量小的话问题不大,不要偷懒,group by才是应该的。

SELECT [ProductionTasks].[ptID]
,[ProductionTasks].[wsID]
,[ptStyleNo]
,[ptStyle]
,[ptAmount]
,[ptDueDate]
,[ptCreatorID]
,[ptModifyID]
,[ptStatus]
,[ptCreationDate]
,Processes.*
,ProductionTaskItems.*
,(select Count(ProductionTaskItems.ptiID) FROM [ProductionTasks]
LEFT JOIN ProductionTaskItems
ON [ProductionTasks].ptID=ProductionTaskItems.ptID
LEFT JOIN Processes
ON Processes.pID=ProductionTaskItems.ptID) as ItemCount
FROM [ProductionTasks]
LEFT JOIN ProductionTaskItems
ON [ProductionTasks].ptID=ProductionTaskItems.ptID
LEFT JOIN Processes
ON Processes.pID=ProductionTaskItems.ptID

#12



SELECT [ProductionTasks].[ptID]
,[ProductionTasks].[wsID]
,[ptStyleNo]
,[ptStyle]
,[ptAmount]
,[ptDueDate]
,[ptCreatorID]
,[ptModifyID]
,[ptStatus]
,[ptCreationDate]
,Processes.*
,ProductionTaskItems.*
,Count(ProductionTaskItems.ptiID) as ItemCount
FROM [ProductionTasks]
LEFT JOIN ProductionTaskItems
ON [ProductionTasks].ptID=ProductionTaskItems.ptID
LEFT JOIN Processes
ON Processes.pID=ProductionTaskItems.ptID group by ItemCount

#13


引用 12 楼 kingdom_0 的回复:
SQL code

SELECT [ProductionTasks].[ptID]
,[ProductionTasks].[wsID]
,[ptStyleNo]
,[ptStyle]
,[ptAmount]
,[ptDueDate]
,[ptCreatorID]
,[ptModifyID]
,[ptStatus]
,[ptCreationDate]
,Processes.*
,Producti……

运行提示“列名ItemCount无效”

#14


引用 1 楼 mr_graceless 的回复:
有分组函数时,查询的列必须要包括在聚合函数或者分组里,这是语法规定,oracle和server一样!
建议:把其它没有count的列加上不影响取值的聚合函数,比如说min,max,因为你查出来也是固定的,加上也没影响。或者就把没有count的列写到group by里。


++

#15


你把表结构贴出来,给出测试数据,及想要的结果,不然没法回答你

#16


引用 6 楼 zyh86102373 的回复:
这个很简单 遇到过的就知道 count();改成count 就可以了

具体怎么做呢?