按除一列之外的所有列进行分组,以计算剩余列上的不同值

Sam*_*Sam 6 sql sql-server-2008

我有table A五行和以下值:

Column1  Column2  Column3  Column4
-------  -------  -------  -------
anna     ben      cat      d
anna     ben      cat      e
anna     ben      cat      f
gina     hugh     ken      m
gina     hugh     ken      p
Run Code Online (Sandbox Code Playgroud)

我想添加另一个名为 的列Column5Column 5前 3 行的值为3,后 2 行的值为 2:

Column1  Column2  Column3  Column4  Column5
-------  -------  -------  -------  -------
anna     ben      cat      d        3
anna     ben      cat      e        3
anna     ben      cat      f        3
gina     hugh     ken      m        2
gina     hugh     ken      p        2
Run Code Online (Sandbox Code Playgroud)

我是怎么做到的:

SELECT DISTINCT COUNT (DISTINCT t1.Column4) AS Column5,
Column1, Column2, Column3, Column4
FROM TableA AS t1
GROUP BY Column1, Column2, Column3;
Run Code Online (Sandbox Code Playgroud)

这不起作用:

消息 8120,级别 16,状态 1,过程 COUNT,第 29 行 列
“Column4”在选择列表中无效,因为它未包含在聚合函数或 GROUP BY 子句中。

有什么帮助吗?非常感激。

PS:如果我添加Column4group by 子句,我在结果表中只得到“1”值Column5

And*_*y M 4

另一种方法是首先选择不同的行,然后应用窗口 COUNT() 函数:

WITH distinctrows AS (
  SELECT DISTINCT
    Column1,
    Column2,
    Column3,
    Column4
  FROM TableA
)
SELECT
  Column1,
  Column2,
  Column3,
  Column4,
  COUNT(Column4) OVER (PARTITION BY Column1, Column2, Column3) AS Column5
FROM distinctrows
;
Run Code Online (Sandbox Code Playgroud)