Подсчет количества различных значений на основе другого набора различных значений - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь подсчитать набор значений на основе другого отдельного набора значений:

-----------------------------------------------------    
|CusID  |Agent1  |Agent2 |Agent 3 |Agent 4 |Agent 5 |
-----------------------------------------------------
|1      |Pat     |Pat    |Jane    |Simon   |Jane    |
|2      |Pater   |Pat    |Simon   |Simon   |Pat     |
|1      |Jane    |Jane   |Simon   |Pat     |Pat     |
|3      |Simon   |Simon  |Jane    |Pat     |Peter   |
|3      |Jane    |Simon  |Pat     |Pater   |Pat     |
-----------------------------------------------------

Я хочу получить:

----------------------------------------------------------------------------
|CusIDUnq  |AgentName|Count|AgentName|Count|AgentName|Count|AgentName|Count|
----------------------------------------------------------------------------
|1         |Pat      |4    |Jane     |4    |Simon    |2    |Peter    |0    |
|2         |Pat      |2    |Jane     |0    |Simon    |2    |Pater    |1    |
|3         |Pat      |3    |Jane     |2    |Simon    |3    |Peter    |2    |
----------------------------------------------------------------------------

Как я могу сделать это с помощью SQL?

Заранее спасибо!

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

-----------------------
|CusID|AgentName|Count|
-----------------------
|1    |Pat      |4    |
|1    |Jane     |4    |
|1    |Simon    |2    |
|2    |Pat      |2    |
|2    |Simon    |2    |
|2    |Peter    |1    |

и т. Д.Здесь мне нужно пропустить 0 результатов, когда агент не указан для конкретного клиента.

Опять большое спасибо!

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

После того, как я испортил логику, я получил некоторый результат, как показано ниже: запрос

     SELECT CUST_ID, 'Pat'
     Case when 'Pat' IN (Agent1,Agent2,
       Agent3,Agent4,Agent5)
      then 
      count(Agent1)+count(Agent2)+
         count(Agent3)+count(Agent4)+
          count(Agent5)
           else 0;
        End As 'Count_Pat',
      'Jane',

       Case when 'Jane' IN 
       (Agent1,Agent2,
       Agent3,Agent4,Agent5)
      then 
      count(Agent1)+count(Agent2)+
         count(Agent3)+count(Agent4)+
          count(Agent5)
           else 0;
        End as 'Count_Jane',
    'Simon',
     Case when 'Simon' IN 
       (Agent1,Agent2,
       Agent3,Agent4,Agent5)
      then 
      count(Agent1)+count(Agent2)+
         count(Agent3)+count(Agent4)+
          count(Agent5)
           else 0;
        End As 'Count_Simon',
         'Peter',
     Case when 'Peter' IN 
       (Agent1,Agent2,
       Agent3,Agent4,Agent5)
      then 
      count(Agent1)+count(Agent2)+
         count(Agent3)+count(Agent4)+
          count(Agent5)
           else 0;
        End as 'Count_Peter',

       From Table 

       group by cust_id;
0 голосов
/ 28 февраля 2019

В вашей модели данных запись cus имеет ровно пять агентов, и существует приоритет (или временная шкала или тому подобное) агентов, при этом один агент - это Агент1, один агент - Агент2 и т. Д.

Однако в своем запросе вы не хотите относиться к агентам по-разному, вам даже не важно, происходят ли они из одной и той же строки.Чтобы обработать их всех одинаково, мы преобразуем вашу таблицу в простую таблицу cus-agent, где в каждой строке есть пара cus и agent.Тогда мы можем просто агрегировать и подсчитывать.

select cusid, agent, count(*)
from
(
  select cusid, agent1 as agent from mytable
  union all
  select cusid, agent2 as agent from mytable
  union all
  select cusid, agent3 as agent from mytable
  union all
  select cusid, agent4 as agent from mytable
  union all
  select cusid, agent5 as agent from mytable
) cus_agent
group by cusid, agent
order by cusid, agent;

Если вы хотите, чтобы агенты разделяли столбцы, а не строки, используйте запрос выше и позаботьтесь о компоновке на уровне GUI (т.е. используйте цикл в вашем приложенииили веб-сайт).

0 голосов
/ 28 февраля 2019

Если я правильно понимаю, вы можете сделать:

select id,
       sum(case when 'Pat' in (Agent1, Agent2, Agent3, Agent4, Agent5)
                then 1 else 0 end
           end) as num_pat,
       sum(case when 'Jane' in (Agent1, Agent2, Agent3, Agent4, Agent5)
                then 1 else 0 end
           end) as num_jane,
       sum(case when 'Simon' in (Agent1, Agent2, Agent3, Agent4, Agent5)
                then 1 else 0 end
           end) as num_simon,
       sum(case when 'Peter' in (Agent1, Agent2, Agent3, Agent4, Agent5)
                then 1 else 0 end
           end) as num_peter
from t
group by id;

Это помещает счетчики в имена столбцов вместе с именем агента, но, похоже, это то, что вы хотите.

...