簡體   English   中英

除了一個列以外的所有列進行分組,以計算剩余列上的不同值

[英]Grouping by all columns except one to count distinct values on the remaining column

我有五行的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列。 對於前3行, Column 5的值為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;

這不起作用:

Msg 8120,Level 16,State 1,Procedure COUNT,29行
列'Column4'在選擇列表中無效,因為它不包含在聚合函數或GROUP BY子句中。

有什么幫助嗎? 非常感激。

PS:如果我在group by子句中添加Column4 ,我在Column5的結果表中只得到值“1”。

另一種做你想要的方法是首先選擇不同的行,然后應用窗口的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
;

如果您不需要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 

(為了簡單起見,我假設列不可為空)

這是你想要的?

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

這應該這樣做:

;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

除了“取消設置”我剛讀過的“僅完全分組”模式但還沒有嘗試過,我只是應用了以下更快的解決方案,這是一個技巧,我這樣做是為了避免出現這個錯誤:

 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,正如我預期的那樣。 謝謝!

警告:這不是一個好的答案。 請參閱下面的評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM