![](/img/trans.png)
[英]count distinct values in column for all columns in a tables in single query
[英]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.