迁移到SQL Server 2012时,MySQL GROUP BY不起作用

时间:2012-12-29 14:28:42

标签: mysql sql sql-server

我正在将我的Delphi应用程序从MySQL迁移到SQL Server 2012.在MySQL中我有这个查询:

SELECT *,(XS+S+M+L+XL+XXL+[1Size]+Custom) as Total FROM StockData  
GROUP BY StyleNr,Customer,Color  
ORDER BY StyleNr,Customer,Color

它完美无缺。但在Microsoft SQL Server 2012中,此查询说

  

Msg 8120,Level 16,State 1,Line 1
  列'StockData.ID'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

如果我将查询更改为:

SELECT *,([XS]+[S]+[M]+[L]+[XL]+[XXL]+[1Size]+[Custom])  total
 FROM [dbo].[stockdata]
 GROUP BY ID,StyleNr,Customer,Color
 ORDER BY StyleNr,Customer,Color

然后我收到此错误:

  

Msg 8120,Level 16,State 1,Line 1
  列'dbo.stockdata.XS'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

有什么想法吗?

这是表的设计视图:

enter image description here

3 个答案:

答案 0 :(得分:6)

SQL Server按预期工作。您必须在SELECT列表中包含GROUP BY或汇总功能中的所有项目:

SELECT *,(XS+S+M+L+XL+XXL+[1Size]+Custom) as Total 
FROM StockData  
-- GROUP BY ID,StyleNr,Customer,Color, XS,S,M,L,XL,XXL,[1Size],Custom
ORDER BY StyleNr,Customer,Color

或者您可以使用:

SELECT StyleNr,Customer,Color, SUM(XS+S+M+L+XL+XXL+[1Size]+Custom) as Total 
FROM StockData  
GROUP BY StyleNr,Customer,Color
ORDER BY StyleNr,Customer,Color;

答案 1 :(得分:1)

聚合查询中的所有列必须由聚合函数或group by使用。尝试只选择您需要的列而不是* I.e.选择stylenr,customer,color,([...])作为Total from。

这是处理聚合的SQL标准方法,您在Oracle中会遇到类似的错误。

答案 2 :(得分:1)

您也可以使用此方法:

with OrdinalOnGroup
(
    SELECT 
        Ordinal = rank() over(partition by StyleNr, Customer, Color order by id) 
        , *, (XS+S+M+L+XL+XXL+[1Size]+Custom) as Total 
    FROM StockData  
)
select * 
from OrdinalOnGroup
where Ordinal = 1;

PARTITION BY表示相关信息的分组,这称为windowing