0

ID int、VALUE 文字列のテーブルがあるとします。

ID    |  VALUE
1        abc 
2        abc 
3        def
4        abc
5        abc
6        abc

値を選択すると、count(*) group by value を取得する必要があります

VALUE   | COUNT
abc       5
def       1

ここで注意が必要なのは、count == 1 の場合、最初のテーブルからその ID を取得する必要があることです。CTE を使用する必要がありますか? ID string == null を追加して update b.ID = a.ID where count == 1 ? を実行する結果セットを作成します。

それとももっと簡単な方法がありますか?

編集:

次のような結果テーブルが必要です。

ID      VALUE  count
null    abc    5
3       def    1
4

4 に答える 4

3

ID 値が uniqueの場合、max(id) = min(id) かどうかを確認するだけです。そうでない場合は、どちらかを使用してください。それ以外の場合は、null を返すことができます。このような:

Select Case When Min(id) = Max(id) Then Min(id) Else Null End As Id,
       Value, Count(*) As [Count]
From   YourTable
Group By Value

すでに集計を実行しているため、MIN 関数と Max 関数を含めるのに余分な (顕著な) 時間がかかることはほとんどありません。これを試してみることをお勧めします。

于 2012-04-04T22:21:48.690 に答える
0

私がそれをする方法は確かにCTEでしょう:

using @group AS (SELECT value, Count(*) as count from MyTable GROUP BY value HAVING count = 1)
SELECT MyTable.ID, @group.value, @group.count from MyTable
   JOIN @group ON @group.value = MyTable.value
于 2012-04-04T22:05:12.130 に答える
0

group by を使用する場合、group by ステートメントの後に、having 句を使用できます。

そう

SELECT [ID]
FROM table
GROUP BY [VALUE]
HAVING COUNT(*) = 1

編集:編集した質問に関して:これはいくつかの楽しい結合と結合を使用します

CREATE TABLE #table
(ID int IDENTITY,
VALUE varchar(3))

INSERT INTO #table (VALUE)
VALUES('abc'),('abc'),('def'),('abc'),('abc'),('abc')

    SELECT * FROM (
    SELECT Null as ID,VALUE, COUNT(*) as [Count]
    FROM #table
    GROUP BY VALUE
    HAVING COUNT(*) > 1
UNION ALL
    SELECT t.ID,t.VALUE,p.Count FROM
    #table t
    JOIN
    (SELECT VALUE, COUNT(*) as [Count]
    FROM #table
    GROUP BY VALUE
    HAVING COUNT(*) = 1) p
    ON t.VALUE=p.VALUE
) a



DROP TABLE #table
于 2012-04-04T22:00:37.330 に答える
-1

最も効率的ではないかもしれませんが、次のようなものが機能します。

SELECT MAX(Id) as ID,Value FROM Table WHERE COUNT(*) = 1 GROUP BY Value
于 2012-04-04T22:00:10.407 に答える