2012-07-15 57 views
2

數不同的值我有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前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, Line 29
Column 'Column4' invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

請幫忙嗎?非常感激。

PS:如果我在group by子句中添加Column4,那麼在Column5的結果表中我只能得到「1」的值。

回答

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 
; 
+0

與我的一個不同之處在於,對於組中的「Column4」複製的行只會在使用此答案的結果中出現一次,並且會多次使用我的答案。儘管OP在他們的示例數據中沒有給出這個例子。 – 2012-07-15 18:27:14

+0

但是他們*在其查詢的SELECT子句中包含了'DISTINCT'。我首先感到困惑,但現在我想我可以看到它的存在。 – 2012-07-15 18:31:18

+0

奇妙的是,我申請了這個答案,它的工作和適合和目的。你們都很棒。 – Sam 2012-07-15 19:41:02

1

這是你在找什麼?

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

謝謝你,安迪!這是有效的,**除了**,它從結果中消除了Column4,以及**我也對Column4 **的信息感興趣。所以**的訣竅是如何在選擇列表中添加Column4,但不是在group by子句中 - 沒有收到該錯誤**! – Sam 2012-07-15 17:21:54

+0

從我剛剛閱讀的內容來看,它可能與不使用'僅完整模式組'有關,因此我可以在select子句中添加Column4而不會出現該錯誤。我正在研究這個解決方案,同時我希望在這裏看到其他建議。非常感謝。 – Sam 2012-07-15 17:35:12

0

除了「解封」模式「唯一全由基」我剛剛看了一下,但還沒有嘗試過,我只是應用了以下更快的解決方案,這是一個把戲,我這樣做是爲了避免得到那個錯誤:

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

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

+1

我並不完全確定,但是我懷疑*你剛剛閱讀的只有完整的GROUP BY *模式與MySQL有關,*與SQL Server沒有關係。 – 2012-07-15 17:47:45

+0

賓果,你很對Andriy,我只是再次的文章,確實有一個提到MySql那裏,所以這不適用於此。儘管如此,我還是很好奇,爲什麼有義務將所有列都包含在Group中,而這些列不是新的或者是將聚合函數應用於其中。在SAS這是另一個數據庫系統,這不是強制性的,我上面的聲明不會引發這個錯誤。 – Sam 2012-07-15 17:50:50

+0

您對我的解決方案以及我之前提到的這項義務有何看法? – Sam 2012-07-15 17:52:10

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 

(我假定列不可爲空爲簡單起見)

+1

我的兩個準確的點。 – 2012-07-15 18:11:34

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 
相關問題