2

実際、私は SQL XML パスの初心者なので、プロになります。シナリオを手に入れました...次のような CTE 関数があります。

Data    Chars   NumberOfOccurance
12  1   1 appears (1 ) times
12  2   2 appears (1 ) times
xx  x   x appears (2 ) times

CTE関数は次のとおりです。

  ;with cte as
    (
        select Data , SUBSTRING(Data,1,1) as Chars,1 as startpos from @t
        union all
        select Data, SUBSTRING(Data, startpos+1,1) as char,startpos+1 from cte where startpos+1<=LEN(data)
    )
    select Data,Chars,Cast(Chars as varchar(1)) + ' appears (' + cast(COUNT(*) as varchar(5))+  ' ) times' as 'NumberOfOccurance' from cte 
    group by data, chars

実際、私は自分の答えをこれにしたいだけです:

data    Number_of_occurances
12  1 appears (1) times 2 appears (1) times
xx  x appears (2) times

私はこれを試しました:

; With Ctea as 
(
select Data , SUBSTRING(Data,1,1) as Chars,1 as startpos from @t
    union all
    select Data, SUBSTRING(Data, startpos+1,1) as char,startpos+1 from ctea where startpos+1<=LEN(data)
)
select Data,Chars,REPLACE((SELECT (Cast(Chars as varchar(1)) + ' appears (' + cast(COUNT(*) as varchar(5))+ ' ) times') AS [data()] FROM Ctea t2 WHERE t2.Data = t1.data FOR XML PATH('')), ' ', ' ;') As Number_of_occurances  from ctea as t1
group by t1.data, t1.Chars

それは言います:

Column 'Ctea.Chars' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

一時テーブルを使用して正確な答えを得たが、それができない場合 CTE

誰でも私の結果を作ることができますか?

4

2 に答える 2

2

問題は CTE とは関係ありません。実際には、次のサブクエリにあります。

SELECT (Cast(Chars as varchar(1)) + 
    ' appears (' + 
    cast(COUNT(*) as varchar(5)) + 
    ' ) times') AS [data()] 
FROM Ctea t2 
WHERE t2.Data = t1.data 
FOR XML PATH('')

COUNT(*)ここでの集計と列の使用方法に注意してくださいChars。少なくともCharsここでグループ化する必要があります。

SELECT (Cast(Chars as varchar(1)) + 
    ' appears (' + 
    cast(COUNT(*) as varchar(5)) + 
    ' ) times') AS [data()] 
FROM Ctea t2 
WHERE t2.Data = t1.data 
GROUP BY t2.Chars
FOR XML PATH('')

さらに、外側のクエリで選択またはグループ化する必要はありませんt1.Chars。これは、Chars の値ごとに 1 行になるためです。

データ文字 Number_of_occurances
12 1 1が出る(1)回 2が出る(1)回
12 2 1が出る(1)回 2が出る(1)回
xx xx が (2) 回出現

最後に、スペースで区切られたリスト (" 1 が (1) 回表示される 2 が (1) 回表示される") を作成しようとしているため、ではなくSTUFF関数を使用する必要があり、すべてのスペース文字をスペースに置き換えず、セミコロン (" 1 ;出現 ;(1) ;回 ;2 ;出現 ;(1) ;回")。REPLACE

したがって、最終的なクエリは次のようになります。

; With Ctea as 
(
    select Data , SUBSTRING(Data,1,1) as Chars,1 as startpos from @t
    union all
    select Data, SUBSTRING(Data, startpos+1,1) as char,startpos+1 from ctea 
    where startpos+1<=LEN(data)
)
select Data,
    STUFF((SELECT cast(' ' as varchar(max)) + (Cast(Chars as varchar(1)) + ' appears (' + cast(COUNT(*) as varchar(5))+ ' ) times') AS [data()] 
           FROM Ctea t2 
           WHERE t2.Data = t1.data 
           GROUP BY t2.Chars 
           FOR XML PATH('')), 1, 1, '') As Number_of_occurances  
from ctea as t1
group by t1.data
于 2015-05-29T06:03:26.277 に答える
0

FOR XML PATHこのように連結に使用できます

  ;with cte as
    (
        select Data , SUBSTRING(Data,1,1) as Chars,1 as startpos from @t
        union all
        select Data, SUBSTRING(Data, startpos+1,1) as char,startpos+1 from cte where startpos+1<=LEN(data)
    ), CTE2 AS
    (
    select Data,Chars,Cast(Chars as varchar(1)) + ' appears (' + cast(COUNT(*) as varchar(5))+  ' ) times' as 'NumberOfOccurance' from cte 
    group by data, chars
    )
    SELECT Data,(SELECT NumberOfOccurance + ' ' FROM CTE2 c2 WHERE c2.Data = C1.Data FOR XML PATH(''),type).value('.','VARCHAR(MAX)') as Number_of_occurances 
    FROM CTE2 C1
    GROUP BY Data
于 2015-05-29T06:03:09.370 に答える