Sql server 为什么列无效,因为它不在聚合函数或GROUPBY子句中?

Sql server 为什么列无效,因为它不在聚合函数或GROUPBY子句中?,sql-server,group-by,Sql Server,Group By,我正在尝试在SQL Server中执行以下查询: Select *, sum(Quantity) as Quantity from tblDeal where buyercode = 25 and dealdate >= '2014/04/01' and dealdate <= '2015/03/31' group by dealno order by DealDate, DealNo 实际上,tbldeal.dealid是tbldeal表中存在的多个列之一 我在互联网上搜索过

我正在尝试在SQL Server中执行以下查询:

Select *, sum(Quantity) as Quantity from tblDeal where buyercode = 25 
and dealdate >= '2014/04/01' and dealdate <= '2015/03/31' 
group by dealno order by DealDate, DealNo
实际上,tbldeal.dealid是tbldeal表中存在的多个列之一


我在互联网上搜索过解决方案,但在大多数情况下,人们建议将列添加到group by子句或添加聚合函数。这些操作可能会消除错误,但可能会影响最终结果。我的要求是按dealno对数据进行分组。我该怎么办?请帮忙

如果使用聚合函数,则不能
选择*
,因为必须
分组那些函数中未包含的所有内容(除非
分组
*
中包含的所有列)

删除
*
并仅添加相关列,然后按
分组:

SELECT DealNo, 
       col1, 
       col2, 
       DealDate,
       SUM(Quantity) AS Quantity 
FROM   tblDeal 
WHERE  buyercode = 25 
       AND DealDate >= '2014/04/01' 
       AND DealDate <= '2015/03/31' 
GROUP  BY DealNo, 
          col1, 
          col2 
          DealDate
ORDER  BY DealDate, 
          DealNo 
假设您有两行,如下所示:

DealNo | col1 | col2 | DealDate   | Quantity
     1 |    0 |    1 | 2014/04/02 |       10
     1 |    2 |    3 | 2014/04/02 |       10
如果您在选择col1和col2时只按DealNo进行分组,您希望SQL Server将哪些值放入col1和col2结果中?

您也可以编写为:

Select *,
       sum(Quantity) OVER ( PARTITION BY dealno ORDER BY dealno ASC) as Quantity 
from @tblDeal where buyercode = 25 
and dealdate >= '2014/04/01' and dealdate <= '2015/03/31' 
--group by dealno 
order by DealDate, DealNo
选择*,
作为数量的(按dealno划分的订单按dealno ASC划分的)和(数量)
来自@tblDeal,其中买方代码=25

和dealdate>='2014/04/01'和dealdate您必须根据查询中未应用聚合的所有其他列进行分组(
SUM
,在您的示例中)
SELECT*。
可能重复@MilenPavlov,这会影响最终结果吗?我的意思是,数据会按dealno进行分组吗?谢谢您的回答,但是我需要在select子句中包含所有列。这样,您就不能仅按dealno进行分组,否则您也必须聚合所有其他列(例如使用MAX)。我现在使用MAX函数来获得解决方案。
DealNo | col1 | col2 | DealDate   | Quantity
     1 |    0 |    1 | 2014/04/02 |       10
     1 |    2 |    3 | 2014/04/02 |       10
Select *,
       sum(Quantity) OVER ( PARTITION BY dealno ORDER BY dealno ASC) as Quantity 
from @tblDeal where buyercode = 25 
and dealdate >= '2014/04/01' and dealdate <= '2015/03/31' 
--group by dealno 
order by DealDate, DealNo