我有一张表,除了一列外,有些行是相同的。我希望按相同的行分组并取单列的平均值。
例如我有表:
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不适用于通配符。
这样做的优雅方法是什么?
顺便说一下,原始表是由左连接产生的,它与非唯一值匹配。
答案 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
。只需将文件夹拖到查询窗口,它就会列出表格的列。