0

特定のフィールドに対して特定の文字のインスタンスをカウントするクエリを実行したいと思います。

たとえば、行を含む「Names」フィールドを持つ「Friends」というテーブルがある場合:Edward、James、Mike。私は出力を得るでしょう:

A 2、D 2、E 3、I1など...

4

2 に答える 2

2

一般的な答えは、各名前を構成文字のテーブルに分割し、それらを数える必要があるということです。

使用しているRDBMSについては言及していません。答えはデータベースエンジンによって少し異なります。

たとえば、これはSQL2005以降で機能します。

DECLARE @friends TABLE (NAMES VARCHAR(30))
DECLARE @maxLen INT

INSERT @friends (NAMES)
SELECT 'Edward'
UNION SELECT 'James'
UNION SELECT 'Mike'

SELECT @maxLen = MAX(LEN(NAMES)) FROM @friends

;WITH numsCte 
AS 
( 
        --dynamic numbers table. If you have a numbers table in your database
        --use that instead, as it will be more efficient.
        SELECT 1 AS n 
        UNION ALL 
        SELECT n+1 FROM numsCte 
        WHERE n < @maxLen
)
,charCTE
AS
( 
        --split the string into a dataset
        SELECT *
        FROM numsCte AS nm
        CROSS APPLY (SELECT NAMES, SUBSTRING(NAMES, n, 1) AS splitChar 
                     FROM @friends
                    ) AS st
        WHERE splitChar > ''
)
SELECT  UPPER(splitChar) AS letter
        ,COUNT(1) AS cnt
FROM charCTE
GROUP BY splitChar
ORDER BY splitChar

しかし、ほぼ確実に、他のデータベースエンジンでは機能しません。

于 2009-10-21T10:13:59.083 に答える
0

1つの方法は、一時テーブルを使用して、WHILEループに入力することです。

declare @letters table (letter varchar(1))
declare @pos int
set @pos = 1
while 1=1
    begin
    insert into @letters
    select substring(name,@pos,1)
    from @names
    where len(name) >= @pos

    if @@rowcount = 0
        break

    set @pos = @pos + 1
    end

select letter, count(*)
from @letters
group by letter

もう1つの方法は、一時テーブル内に、またはこの例のように、再帰共通テーブル式(CTE)を使用して、有効な文字位置のリストを作成することです。

declare @maxLen int
select @maxLen = max(len(name)) from @names
;WITH CharPositions (i) AS  ( 
    select 1
    union all
    select i+1 
    from CharPositions
    where i < @maxLen
)
select substring(n.name,cp.i,1), count(*)
from @names n
inner join CharPositions cp on cp.i <= len(n.name)
group by substring(n.name,cp.i,1)

このデータセットに対してコードサンプルをテストしました。

declare @names table (name varchar(max))
insert into @names values ('abc')
insert into @names values ('def')
insert into @names values ('def')
insert into @names values ('g')
insert into @names values ('g')
insert into @names values ('g')
于 2009-10-21T11:15:02.667 に答える