【问题标题】:Get one row from the Grouped View in SQL Server从 SQL Server 中的分组视图中获取一行
【发布时间】:2020-05-29 09:19:46
【问题描述】:

我在 SQL Server 中运行查询时遇到问题。在 MYSQL 中运行良好,但必须切换到 SQL Server。

运行选择查询时的错误消息:

dbo.regioomzet.regio 列在选择列表中无效,因为它 不包含在聚合函数或 GROUP BY 中 子句。

代码如下:

USE aenc;
GO

CREATE VIEW RegioOmzet (
    regio
    ,omzet
    )
AS
SELECT so.region
    ,Sum(p.unit_price * soi.quantity) AS omzet
FROM sales_order so
JOIN sales_order_item soi ON so.id = soi.id
JOIN product p ON soi.prod_id = p.id
GROUP BY so.region;
GO

这是 SQL Server 中所有出错的选择查询。

SELECT ro.regio
    ,MAX(ro.omzet)
FROM dbo.regioomzet ro

基本上,每一行都有一个 int,我希望从该视图返回的最大 int 为 1 行。但我得到聚合函数组错误。不知道怎么解决?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    当使用聚合函数时,SQL Server 要求 SELECT 列表中的所有列要么被聚合,要么被显式添加到 GROUP BY 子句中。早期版本的 MySQL 不需要这样做,这样可以加快输入速度,但可能会产生意外/不需要的结果。

    因此,您只需在查询中添加显式 GROUP BY 子句即可。

    select ro.regio, MAX(ro.omzet)
    from dbo.regioomzet ro
    group by ro.regio;
    

    编辑:我误解了想要的输出。对于最大的max(ro.omzet) 行:

    select top (1)
      ro.regio, 
      MAX(ro.omzet)
    from dbo.regioomzet ro
    group by ro.regio
    order by MAX(ro.omzet) desc;
    

    TOP(n) 语法是 MySQL 使用的LIMIT n 的 SQL Server 实现。

    【讨论】:

    • 我之前尝试过,但是不能只得到 1 行作为输出吗?例如,具有最大 omzet (ro.omzet) 的区域因此是 max(ro.omzet)
    • @LeslieLauw,我误解了所需的输出。请查看编辑后的答案。
    • 啊,现在可以了!谢谢! SQL server 与 MySql 有很大不同 :) 仍然需要习惯不同的语法
    • 这里有很多人可以在您习惯翻译时帮助您。 :)
    猜你喜欢
    • 1970-01-01
    • 2019-04-23
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多