Sql server 在sql server上拆分字符串并计数出现次数

Sql server 在sql server上拆分字符串并计数出现次数,sql-server,Sql Server,我有一个包含两列的表: 反馈ID,成绩表 feedbackidit-是表的id gradeListvarchar100-是一个按“,”拆分的等级字符串。 等级介于[0-1]之间 示例:1,0.5,1,0,0.2 我想得到每一行的成功率。 上述示例的成功百分比为:0.4 我提出了下面的查询,它工作正常,但有点慢。 有什么建议可以让我做得更快吗 SELECT Distinct FeedbackID , S.a.value('count(/H/r[.=1])', '

我有一个包含两列的表: 反馈ID,成绩表

feedbackidit-是表的id gradeListvarchar100-是一个按“,”拆分的等级字符串。 等级介于[0-1]之间 示例:1,0.5,1,0,0.2

我想得到每一行的成功率。 上述示例的成功百分比为:0.4

我提出了下面的查询,它工作正常,但有点慢。 有什么建议可以让我做得更快吗

    SELECT Distinct FeedbackID          
    , S.a.value('count(/H/r[.=1])', 'INT') AS countingSuccesses
    , S.a.value('count(/H/r)', 'INT') AS countingAll            
    FROM (            
        SELECT *,CAST (N'<H><r>' + REPLACE(gradeList, ',', '</r><r>')  + '</r></H>' AS XML) AS [vals]
        FROM FEED_QuestionsGenerator as QEFB
     )  as d
     CROSS APPLY d.[vals].nodes('/H/r') S(a)

我将我的方法与使用Split函数的方法进行了比较,执行计划显示查询1相对于批处理的成本为100% 查询2相对于批处理的成本为0%,因此我可以安全地假设使用拆分要快得多

以下是使用拆分的代码:

SELECT gradeList,
    (
        (SELECT sum(cast(Data AS FLOAT)) FROM dbo.Split(gradeList,',') WHERE Data = '1')/
        (SELECT count(cast(Data AS FLOAT)) FROM dbo.Split(gradeList,',') )
    ) AS AnswersPrecentage FROM [Feed_QuestionsGenerator]

我将我的方法与使用Split函数的方法进行了比较,执行计划显示查询1相对于批处理的成本为100% 查询2相对于批处理的成本为0%,因此我可以安全地假设使用拆分要快得多

以下是使用拆分的代码:

SELECT gradeList,
    (
        (SELECT sum(cast(Data AS FLOAT)) FROM dbo.Split(gradeList,',') WHERE Data = '1')/
        (SELECT count(cast(Data AS FLOAT)) FROM dbo.Split(gradeList,',') )
    ) AS AnswersPrecentage FROM [Feed_QuestionsGenerator]

您是否可以更改数据模型,使每个年级在自己的表中分别位于一行中?另一个选项是使用像DelimitedSplit8k这样的字符串拆分函数,但不知道这是快还是慢。我同意@JamesZ关于表结构的观点。你所做的违背了1NF,只会带来痛苦。如果您正确地规范化数据,dml是无痛的。我可以更改表结构,但这将需要大量的时间和工作。我知道它违反了1NF,但我们需要该值与服务器的“,”一起使用。我仍然想知道是否可以更快地完成。你能改变数据模型,让每个等级在一个单独的表格中单独列出来吗?另一个选项是使用像DelimitedSplit8k这样的字符串拆分函数,但不知道这是快还是慢。我同意@JamesZ关于表结构的观点。你所做的违背了1NF,只会带来痛苦。如果您正确地规范化数据,dml是无痛的。我可以更改表结构,但这将需要大量的时间和工作。我知道它违反了1NF,但我们需要该值与服务器的“,”一起使用。我仍然想知道是否可以更快地完成。你能改变数据模型,让每个等级在一个单独的表格中单独列出来吗?另一个选项是使用像DelimitedSplit8k这样的字符串拆分函数,但不知道这是快还是慢。我同意@JamesZ关于表结构的观点。你所做的违背了1NF,只会带来痛苦。如果您正确地规范化数据,dml是无痛的。我可以更改表结构,但这将需要大量的时间和工作。我知道它违反了1NF,但我们需要该值与服务器的“,”一起使用。我仍然不知道是否可以做得更快。