【问题标题】:MySQL GROUP BY doesn't work when migrated to SQL Server 2012MySQL GROUP BY 在迁移到 SQL Server 2012 时不起作用
【发布时间】:2012-12-29 14:28:42
【问题描述】:

我正在将我的 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 子句中。

有什么想法吗?

这是表格的设计视图:

【问题讨论】:

  • (StyleNr,Customer,Color) 组合是唯一的吗?如果是,只需删除 GROUP BY 行。如果不是,那么 MySQL 查询给出了错误的、不确定的结果。
  • 这主要是为了防止出现重复值,因为在最后一个数据库中存在重复值。

标签: mysql sql sql-server


【解决方案1】:

SQL Server 正在按预期工作。您必须在 GROUP BY 或聚合函数中包含 SELECT 列表中的所有项目:

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;

【讨论】:

  • 忘记在 Group By 附近添加 ID,但感谢它起作用了 :)
  • @bluefeet 为什么不从第一个查询中删除 GROUP BY
  • @ypercube 你是对的,它是不需要的,特别是如果 ID 字段是唯一的,那么总数将不正确。
  • 因为有很多重复的样式、客户、颜色字段,我只想看到不同的:)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您也可以使用这种方法:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 2010-11-19
      • 2017-12-23
      • 1970-01-01
      相关资源
      最近更新 更多