SQL - разделить строку данных и назначить значения баллов

Этот метод добавит индекс в существующий файл, если необходимо:

Если файл существует, найдите позицию последнего подчеркивания. Если содержимое после подчеркивания является числом, увеличьте это число. иначе добавьте первый индекс. повторите, пока не будет найдено неиспользуемое имя файла.

static public string AddIndexToFileNameIfNeeded(string sFileNameWithPath)
{
    string sFileNameWithIndex = sFileNameWithPath;

    while (File.Exists(sFileNameWithIndex)) // run in while scoop so if after adding an index the the file name the new file name exist, run again until find a unused file name
    { // File exist, need to add index

        string sFilePath = Path.GetDirectoryName(sFileNameWithIndex);
        string sFileName = Path.GetFileNameWithoutExtension(sFileNameWithIndex);
        string sFileExtension = Path.GetExtension(sFileNameWithIndex);

        if (sFileName.Contains('_'))
        { // Need to increase the existing index by one or add first index

            int iIndexOfUnderscore = sFileName.LastIndexOf('_');
            string sContentAfterUnderscore = sFileName.Substring(iIndexOfUnderscore + 1);

            // check if content after last underscore is a number, if so increase index by one, if not add the number _01
            int iCurrentIndex;
            bool bIsContentAfterLastUnderscoreIsNumber = int.TryParse(sContentAfterUnderscore, out iCurrentIndex);
            if (bIsContentAfterLastUnderscoreIsNumber)
            {
                iCurrentIndex++;
                string sContentBeforUnderscore = sFileName.Substring(0, iIndexOfUnderscore);

                sFileName = sContentBeforUnderscore + "_" + iCurrentIndex.ToString("000");
                sFileNameWithIndex = sFilePath + "\\" + sFileName + sFileExtension;
            }
            else
            {
                sFileNameWithIndex = sFilePath + "\\" + sFileName + "_001" + sFileExtension;
            }
        }
        else
        { // No underscore in file name. Simple add first index
            sFileNameWithIndex = sFilePath + "\\" + sFileName + "_001" + sFileExtension;
        }
    }

    return sFileNameWithIndex;
}
2
задан Lynchie 19 March 2019 в 13:58
поделиться

3 ответа

Еще одним вариантом является UNION ALL

Пример

Select *
      ,Score = 1.0  / sum(1) over(partition by PolicyRef) 
 From  (
        Select Agent = Opener
             ,PolicyRef
             ,[Transaction Type]
         from #temptable
        Union All
        Select Agent = Closer
             ,PolicyRef
             ,[Transaction Type]
         from #temptable
         Where Opener<>Closer
       ) A

Возвращает

[116 ] enter image description here

0
ответ дан John Cappelletti 19 March 2019 в 13:58
поделиться

Используйте apply с case выражениями:

select v.agent, t.policy_ref, t.transaction_type, v.score
from #temptable t cross apply
     (values (opener, (case when t.opener = t.closer then 1.0 else 0.5 end)),
             (case when t.opener <> t.closer then t.closer end, 0.5)
     ) v(agent, score)
where v.agent is not null;

Или:

select v.agent, t.policy_ref, t.transaction_type,
       (case when t.opener = t.closer then 1.0 else 0.5 end) as score
from #temptable t cross apply
     (values (t.opener, 1),
             (t.closer, 2)
     ) v(agent, which)
where (t.opener <> t.closer) or (which = 1)
0
ответ дан Yogesh Sharma 19 March 2019 в 13:58
поделиться

Мне кажется, что вы пытаетесь составить слишком сложную таблицу для данных, которые лучше всего организовать в несколько таблиц. Это должно помочь вам решить проблему подсчета.

Для меня имеет смысл составить более одной таблицы, чтобы вы могли назначать уникальные ключи. Я бы создал таблицу политик с уникальным ключом для каждой политики ref. Затем еще одну таблицу для каждого агента с уникальным ключом для каждого агента. А потом третий стол, который будет похож на тот, который вы делали.

Opener  | Closer  | Policy Ref | Transaction Type
Agent A | Agent B | ABCD01EF01 | New Business
Agent C | Agent C | ZYXA01EF01 | New Business

Затем с помощью запросов с объединениями и вычисленными полями вы можете построить свою таблицу результатов.

Agent   | Policy Ref | Transaction Type | Score
Agent A | ABCD01EF01 | New Business     | 0.5 
Agent B | ABCD01EF01 | New Business     | 0.5
Agent C | ZYXA01EF01 | New Business     | 1.0

Тогда вы можете использовать количество агентов для каждой ссылки на политику.

У вас могут быть другие более простые или изящные способы сделать это, но, по крайней мере, я думаю, что это должно сработать.

0
ответ дан Tony 19 March 2019 в 13:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: