SQL - разделить строку данных и назначить значения баллов - PullRequest
2 голосов
/ 19 марта 2019

Я прошу прощения за плохой заголовок, так как я не имел ни малейшего понятия, как лучше всего его произнести.

У меня есть таблица, в которой я возвращаю строки, подобные этой:

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

Создать код

    CREATE TABLE #temptable ( [Opener] varchar(50), [Closer] varchar(50), [PolicyRef] varchar(10), [Transaction Type] varchar(14) )
INSERT INTO #temptable
VALUES
( 'Agent C', 'Agent C', 'ZYXA01EF01', 'New Business' ), 
( 'Agent A', 'Agent B', 'ABCD01EF01', 'New Business' )

DROP TABLE #temptable

В настоящее время мы в основном получаем 1,0 балла, для каждой строки, если Opener = Closer, тогда столбец «Score» должен быть равен 1,0 и возвращать только одну строку,однако, если Opener <> ближе, чем должно быть 2 строки с 'Score', разделенным на 0,5 между Opener и Closer, результат должен быть таким:

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

Я думал, что кросс-применение с row_numbering дляопределить, было ли больше одной строки в "Policy Ref", однако я не могу заставить его работать.

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

Ответы [ 3 ]

2 голосов
/ 19 марта 2019

Просто еще один вариант: 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

Возвращает

enter image description here

1 голос
/ 19 марта 2019

Используйте 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 голосов
/ 19 марта 2019

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...