2015-06-16 6 views
1

У меня есть таблица с двумя столбцами: feedbackID, gradeList.Разбиение строки и подсчет числа sql server

feedbackID (int) - это идентификатор таблицы gradeList (varchar (100)) - это строка разрядов, разделенных символом ','. класс находится между [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) 
+1

Вы можете изменить модель данных, чтобы каждый из классов в отдельной строке в собственной таблице? Другой вариант - использовать функцию разделения строк, такую ​​как DelimitedSplit8k, но не знаю, быстрее или медленнее. –

+1

Я согласен с @JamesZ о вашей структуре таблицы. То, что вы нарушаете 1NF и не причиняет ничего, кроме боли. Если вы правильно нормализуете свои данные, dml безболезнен. –

+0

Я могу изменить структуру таблицы, но это займет много времени и много работы. я знаю, что это нарушает 1NF, но нам нужно это значение с помощью «,» для сервера. Мне все еще интересно, можно ли это сделать быстрее. – Yossi

ответ

0

я сравнил мой метод с одним использованием Разделить функции и план выполнения показывает, что запрос 1 стоимость 100% по отношению к партии и запрос 2 Стоимость 0% по отношению к партии, так что я могу с уверенностью предположить, что использование сплит намного быстрее.

здесь код с помощью Split:

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] 
Смежные вопросы