Этот метод добавит индекс в существующий файл, если необходимо:
Если файл существует, найдите позицию последнего подчеркивания. Если содержимое после подчеркивания является числом, увеличьте это число. иначе добавьте первый индекс. повторите, пока не будет найдено неиспользуемое имя файла.
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;
}
Еще одним вариантом является 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 ]
Используйте 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)
Мне кажется, что вы пытаетесь составить слишком сложную таблицу для данных, которые лучше всего организовать в несколько таблиц. Это должно помочь вам решить проблему подсчета.
Для меня имеет смысл составить более одной таблицы, чтобы вы могли назначать уникальные ключи. Я бы создал таблицу политик с уникальным ключом для каждой политики 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
Тогда вы можете использовать количество агентов для каждой ссылки на политику.
У вас могут быть другие более простые или изящные способы сделать это, но, по крайней мере, я думаю, что это должно сработать.