按SQL Server中的多列分组

时间:2018-02-16 16:42:24

标签: sql sql-server

我有一张表,除了一列外,有些行是相同的。我希望按相同的行分组并取单列的平均值。

例如我有表:

A   B   C   D
-------------
a   b   c   2
a   b   c   2
a   b   c   5
d   e   f   8
d   e   f   10

期望的结果:

A   B   C   D
-------------
a   b   c   3
d   e   f   9

我可以通过以下方式轻松完成:

SELECT A, B, C, AVG(D)
FROM [table] 
GROUP BY A, B, C

我的问题是我有很多列,手动将每一列键入GROUP BY都很麻烦。例如,我想这样做但不可能:

SELECT (* but not D), AVG(D)
FROM [table] 
GROUP BY (* but not D)

这两个问题是我不知道如何形成一个排除D的通配符,而且似乎GROUP BY不适用于通配符。

这样做的优雅方法是什么?

顺便说一下,原始表是由左连接产生的,它与非唯一值匹配。

4 个答案:

答案 0 :(得分:3)

不幸的是,没有一种神奇的方法可以做到这一点,但是使用SSMS可以更容易:

  • 右键单击表格
  • 脚本表格为 - >
  • 选择 - >
  • 新查询窗口

这为您提供了格式化的SELECT列表,您可以从中删除聚合列并将其复制粘贴到GROUP BY。它至少比从头开始要好一点。

答案 1 :(得分:1)

您可以使用动态SQL。
See working demo

DECLARE @sqlCommand nvarchar(max)
DECLARE @columnList nvarchar(max)

SET @columnList= STUFF((SELECT ',' + c.name
    from sys.columns c join sys.tables t on c.object_id =t.object_id
    and t.name ='yourtable' and c.name <>'D'
FOR XML PATH(''), Type
).value('.', 'NVARCHAR(MAX)') 
,1,1,'')
SET @sqlCommand = 'SELECT ' + @columnList + ', AVG(D) as D FROM [yourtable] GROUP BY  ' + @columnList
EXEC (@sqlCommand)

答案 2 :(得分:0)

您也可以使用 Select name from sys.columns where table_name = <table>

获取表格的所有列并在“分组依据”部分中指定

答案 3 :(得分:0)

SSMS中,将Object Explorer展开到所需的表格。展开表格,您会看到文件夹Column。只需将文件夹拖到查询窗口,它就会列出表格的列。