SQL Server中无需分组实现列值出现次数的每行统计
实现SQL Server中每行显示对应Column A的全局出现次数
原始表(Table1)
| Column A | Column B |
|---|---|
| A | Cell 2 |
| A | Cell 4 |
| B | Cell 2 |
| A | Cell 4 |
| B | Cell 2 |
| A | Cell 4 |
需求
需要新增Column C列,每行显示对应Column A值在整个表中的出现次数,最终结果如下:
| Column A | Column B | Column C |
|---|---|---|
| A | Cell 2 | 4 |
| A | Cell 4 | 4 |
| B | Cell 2 | 2 |
| A | Cell 4 | 4 |
| B | Cell 2 | 2 |
| A | Cell 4 | 4 |
尝试的错误查询
使用带GROUP BY的查询会将结果按ColumnA分组聚合,仅返回两行,无法满足每行显示统计值的需求:
Select ColumnA, Count(ColumnA) as ColumnC from Table1 group By columnA
正确SQL语句
方法1:窗口函数(推荐)
利用SQL Server的窗口函数COUNT() OVER(PARTITION BY ColumnA),可以在不分组的前提下,计算每个ColumnA分组的全局出现次数,直接匹配到每一行:
SELECT ColumnA, ColumnB, COUNT(ColumnA) OVER(PARTITION BY ColumnA) AS ColumnC FROM Table1;
方法2:子查询关联
先通过子查询统计每个ColumnA的出现次数,再将统计结果与原表关联,把次数匹配到对应行:
SELECT t1.ColumnA, t1.ColumnB, t2.Cnt AS ColumnC FROM Table1 t1 JOIN ( SELECT ColumnA, COUNT(*) AS Cnt FROM Table1 GROUP BY ColumnA ) t2 ON t1.ColumnA = t2.ColumnA;
内容的提问来源于stack exchange,提问作者Shablu Rizvi
相关产品推荐
相关产品推荐

