我正在将我的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子句中。
有什么想法吗?
这是表的设计视图:
答案 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