У меня есть таблица с двумя столбцами: 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)
Вы можете изменить модель данных, чтобы каждый из классов в отдельной строке в собственной таблице? Другой вариант - использовать функцию разделения строк, такую как DelimitedSplit8k, но не знаю, быстрее или медленнее. –
Я согласен с @JamesZ о вашей структуре таблицы. То, что вы нарушаете 1NF и не причиняет ничего, кроме боли. Если вы правильно нормализуете свои данные, dml безболезнен. –
Я могу изменить структуру таблицы, но это займет много времени и много работы. я знаю, что это нарушает 1NF, но нам нужно это значение с помощью «,» для сервера. Мне все еще интересно, можно ли это сделать быстрее. – Yossi