2

我正在将我的 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 中,这个查询说

消息 8120,级别 16,状态 1,行 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

然后我得到这个错误:

消息 8120,级别 16,状态 1,行 1
列 'dbo.stockdata.XS' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。

有任何想法吗?

这是表的设计视图:

在此处输入图像描述

4

3 回答 3

6

SQL Server 正在按预期工作。您必须将SELECT列表中的所有项目包含在 aGROUP 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;
于 2012-12-29T14:32:02.423 回答
1

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

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

于 2012-12-29T14:31:45.950 回答
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 表示相关信息的分组,这称为加窗

于 2012-12-29T14:41:07.247 回答