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因为它会导致每个字符值一行:

数据字符 Number_of_occurrances
12 1 1 出现 (1) 次 2 出现 (1) 次
12 2 1 出现 (1) 次 2 出现 (1) 次
xx xx 出现 (2) 次

最后,您很可能应该使用该STUFF函数,而不是REPLACE,因为您正在尝试创建一个以空格分隔的列表(“ 1 出现 (1) 次 2 出现 (1) 次”),而不是用空格替换所有空格字符和分号(“ 1;出现;(1);次;2;出现;(1);次“)。

因此,您的最终查询应该是:

; 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 回答