0

同じ名前のテーブル エントリの量と、それらの各エントリに関連付けられた一意の ID を表示しようとしています。

だから私はそのようなテーブルを持っています...

Table Names
------------------------------
ID    Name
0    John
1    Mike
2    John
3    Mike
4    Adam
5    Mike

出力を次のようにしたいと思います。

Name | Count | IDs
---------------------
Mike     3     1,3,5
John     2     0,2
Adam     1     4

すべての一意の ID を表示することを除いて、これを行う次のクエリがあります。

select name, count(*) as ct from names group by name order by ct desc;
4

3 に答える 3

3
select name,
       count(id) as ct, 
       group_concat(id) as IDs
from names
group by name
order by ct desc;

そのためにGROUP_CONCATを使用できます

于 2012-08-06T17:46:56.433 に答える
1

次に、再帰 CTE を使用した別の SQL Server メソッドを示します。

SQLFiddleへのリンク

; with MyCTE(name,ids, name_id, seq)
as(
    select name, CAST( '' AS VARCHAR(8000) ), -1, 0
    from Data
    group by name
    union all
    select d.name,  
            CAST( ids + CASE WHEN seq = 0 THEN '' ELSE ', ' END + cast(id as varchar) AS VARCHAR(8000) ),
            CAST( id AS int),
            seq + 1
    from MyCTE cte 
    join Data d
        on cte.name = d.name
    where d.id > cte.name_id
)
SELECT name, ids
      FROM ( SELECT name, ids,
                    RANK() OVER ( PARTITION BY name ORDER BY seq DESC )
               FROM MyCTE ) D ( name, ids, rank )
     WHERE rank = 1
于 2012-08-06T19:30:49.497 に答える
1

使用している MSSQL のバージョン (2005 以降) によっては、このFOR XML PATHオプションを使用できます。

SELECT 
    Name, 
    COUNT(*) AS ct, 
    STUFF((SELECT ',' + CAST(ID AS varchar(MAX)) 
           FROM names i 
           WHERE i.Name = n.Name FOR XML PATH(''))
        , 1, 1, '') as IDs
FROM names n
GROUP BY Name
ORDER BY ct DESC

SQLCLRオプションを使用しない限り、MSSQLに最も近いものにgroup_concatなります(私は経験がありません)。このSTUFF関数は、先頭のコンマを処理します。SELECTまた、 XML 要素で選択している要素をラップするため、inner にエイリアスを付けたくありません(のエイリアスによりTD、各要素は として返されます<TD>value</TD>)。

上記の入力を考えると、次の結果が得られます。

Name    ct  IDs
Mike    3   1,3,5
John    2   0,2
Adam    1   4

編集:免責事項

&この手法は、特殊文字 (アンパサンド、より小さい<、より大きい、>その他の任意の数の書式設定文字など) を含む可能性のある文字列フィールドに対して意図したとおりには機能しません。そのため、この手法は単純な整数値に対して最も有益ですが、エスケープする必要のある特殊文字がないことが絶対に確実な場合は、テキストに対しても使用できます。そのため、ここに投稿された解決策を読んで、これらの文字が適切にエスケープされるようにしてください。

于 2012-08-06T18:06:16.530 に答える