4

私はtable A5行と次の値を持っています:

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、プロシージャ カウント、行 29
列 'Column4' は、集計関数にも GROUP BY 句にも含まれていないため、選択リストでは無効です。

何か助けてください。とても有難い。

PS: Column4group by 句を追加すると、 の結果テーブルで "1" の値のみが得られますColumn5

4

5 に答える 5

4

必要なことを行うもう 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
;
于 2012-07-15T18:22:42.470 に答える
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 

(簡単にするために、列はnull可能ではないと仮定しました)

于 2012-07-15T18:03:09.663 に答える
1

これはあなたが探しているものですか?

SELECT COUNT (DISTINCT t1.Column4) AS Column5,
Column1, Column2, Column3
FROM TableA AS t1
GROUP BY Column1, Column2, Column3;
于 2012-07-15T17:09:35.077 に答える
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
于 2012-07-15T19:08:16.510 に答える
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 の範囲の値が表示されます。ありがとう!

警告: これは良い答えではありません。理由については、以下のコメントを参照してください。

于 2012-07-15T17:39:06.553 に答える