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

时间:2012-07-15 17:01:09

标签: 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

我想添加另一个名为Column5的列。 Column 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

我是怎么做到的:

SELECT DISTINCT COUNT (DISTINCT t1.Column4) AS Column5,
Column1, Column2, Column3, Column4
FROM TableA AS t1
GROUP BY Column1, Column2, Column3;

这不起作用:

  

消息8120,等级16,状态1,程序COUNT,行29   专栏'第4列'在选择列表中无效,因为它不包含在任何一个中   聚合函数或GROUP BY子句。

请帮忙吗?非常感激。

PS:如果我在group by子句中添加Column4,我只会得到" 1"在Column5中的结果表中。

5 个答案:

答案 0 :(得分: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
;

答案 1 :(得分:3)

如果您不需要DISTINCT,这将很容易。

SELECT Column1,
       Column2,
       Column3,
       Column4,
       Count(Column4) OVER (partition BY Column1, Column2, Column3) AS Column5
FROM   TableA AS t1 

但SQL Server中的窗口聚合目前不支持DISTINCT,因此您可以使用

WITH CTE
     AS (SELECT Column1,
                Column2,
                Column3,
                Count(DISTINCT Column4) AS Column5
         FROM   TableA
         GROUP  BY Column1,
                   Column2,
                   Column3)
SELECT A.Column1,
       A.Column2,
       A.Column3,
       A.Column4,
       C.Column5
FROM   TableA A
       JOIN CTE C
         ON A.Column1 = C.Column1
            AND A.Column2 = C.Column2
            AND A.Column3 = C.Column3 

(为了简单起见,我假设列不可为空)

答案 2 :(得分:1)

这是你在找什么?

SELECT COUNT (DISTINCT t1.Column4) AS Column5,
Column1, Column2, Column3
FROM TableA AS t1
GROUP BY Column1, Column2, Column3;

答案 3 :(得分:1)

这应该这样做:

;WITH 
  countCol4 As
(
    SELECT  Column1, Column2, Column3, Column4
    ,       ROW_NUMBER() OVER(PARTITION BY Column1, Column2, Column3, Column4
                ORDER BY Column4)   As Col4Count
    FROM    TableA  As t1
)
SELECT  Column1, Column2, Column3, Column4
,       COUNT(*) OVER(PARTITION BY Column1, Column2, Column3) As Column5
FROM    countCol4
WHERE   Col4Count = 1

答案 4 :(得分:0)

除了“取消设置”我刚读过的“仅完全分组”模式但还没有尝试过,我只是应用了以下更快的解决方案,这是一个技巧,我这样做是为了避免出现这个错误:< / p>

 SELECT 
     COUNT (DISTINCT t1.Column4) AS Column5, Column1, Column2, Column3, MAX(Column4) AS Column4
 FROM TableA AS t1 
 GROUP BY Column1, Column2, Column3;

我在Column4上有字符值。这似乎没问题,我现在看到Column5中的值为1-6,正如我预期的那样。谢谢!

警告:这不是一个好的答案。请参阅以下评论以了解原因。