代码之家  ›  专栏  ›  技术社区  ›  Ryan Gadsdon

是否可以在SQL Server中使用MAX(*)?

  •  1
  • Ryan Gadsdon  · 技术社区  · 7 年前

    我正在处理一个巨大的列列表(大约50列),其中我只需要按一列进行分组。SQL Server中是否有我可以通过以下方式聚合列

    SELECT MAX(*)
    FROM View1
    GROUP BY Column1
    

    而不必遍历每个函数并指定聚合函数。我在网上看了一下,但什么也找不到。有没有人能给我什么建议或指导,或者只是一个逐行检查的例子?

    谢谢

    5 回复  |  直到 7 年前
        1
  •  5
  •   gofr1    7 年前

    可以使用系统表生成所需的查询:

    DECLARE @ViewName sysname = N'View1',
            @query nvarchar(max),
            @Column sysname = 'Column1'
    
    SET @query = N'SELECT ' + @Column + ',' + CHAR(10)
    
    SELECT @query = @query + N'MAX('+c.[name]+') as '+c.[name]+',' + CHAR(10)
    FROM sys.views v
    INNER JOIN sys.columns c
        ON v.[object_id] = c.[object_id]
    WHERE v.[name] = @ViewName AND c.[name] != @Column
    
    
    SET @query = STUFF(@query,LEN(@query)-1,1,'') + 'FROM '+@ViewName + CHAR(10) + 'GROUP BY ' + @Column
    
    PRINT @query
    

    输出将为:

    SELECT Column1,
    MAX(Column2) as Column2,
    MAX(Column3) as Column3,
    ...
    MAX(ColumnN) as ColumnN
    FROM View1
    GROUP BY Column1
    

    你可以 Ctrl键 + C Ctrl键 + 五、 在新查询窗口上执行,或在此处使用以下命令执行:

    EXEC (@query)
    

    如果是表格,您需要使用 sys.tables

    如果视图或表不在默认架构中,则需要手动指定它。

    SET @query = STUFF(@query,LEN(@query)-1,1,'') + 'FROM dbo.'+@ViewName + CHAR(10) + 'GROUP BY ' + @Column
    
        2
  •  1
  •   Joshua Schlichting    7 年前

    没有。不幸的是,你必须写出这些列。

        3
  •  0
  •   Kannan Kandasamy    7 年前

    如果需要不同列的最大值,可以按以下方式尝试

    Select max(yourcolumn) from
    (
        Select col1 from yourtable
        union all Select col2 from yourtable
        union all Select col3 from yourtable
        ...
    ) a
    
        4
  •  0
  •   Vivek Kumar    7 年前

    否,不能使用max(*)。 您必须在max函数中指定一个列名,如下所示

    select max(column_name) from table_name;
    
        5
  •  0
  •   Paul Williams    7 年前

    你不能写 select max(*) . 这会导致错误 Incorrect syntax near '*'. 相反,您需要指定列。

    获得多列最大值的一种方法是 unpivot 桌子。一种有效的方法是使用 cross apply 为每列生成单独的行值。

    例如,下面的代码在所有行的3个不同列中查找最大值:

    declare @test table
    (
        id int primary key clustered,
        value1 int,
        value2 int,
        value3 int
    )
    
    insert into @test (id, value1, value2, value3)
    values (1, 100, 0, 0), (2, 0, 50, 0), (3, 0, 0, 25)
    
    select max(TestValue) -- returns 100
    from @test
    cross apply
    (
        values(value1),(value2), (value3)
    ) TestValues (TestValue)