Создавайте столбцы с частотой кода для каждого идентификатора - PullRequest
1 голос
/ 29 мая 2020

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

   |Id  | Code
   ------------
   | 1  |   C   
   | 1  |   I   
   | 2  |   I   
   | 2  |   C   
   | 2  |   D   
   | 2  |   D   
   | 3  |   C
   | 3  |   I   
   | 3  |   D 
   | 4  |   I   
   | 4  |   C
   | 4  |   C   

Результат должен быть примерно таким:

   |Id  | Count | #Code C | #Code I | #Code D
   -------------------------------------------
   | 1  | 2     |    1    |    1    |   0  
   | 2  | 3     |    1    |    0    |   2  
   | 3  | 3     |    1    |    1    |   1  
   | 4  | 2     |    2    |    1    |   0  

Можете ли вы дать мне какой совет по этому поводу?

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Вы можете попробовать следующий код SQL на SQL сервере.

DECLARE @table Table(Id tinyint,  Code CHAR(1))

INSERT INTO @table 
values
    (1     ,'C'),   
    (1     ,'I'),   
    (2     ,'I'),   
    (2     ,'C'),   
    (2     ,'D'),   
    (2     ,'D'),   
    (3     ,'C'),
    (3     ,'I'),   
    (3     ,'D'), 
    (4     ,'I'),   
    (4     ,'C'),
    (4     ,'C');

SELECT Id, c+d+i as [Count], [c] as [#Code C],[d] as [#Code D],[i] as [#Code I] 
FROM @table
PIVOT
(
Count(code) FOR code IN ([c],[d],[i])
) as pvt
+----+-------+---------+---------+---------+
| Id | Count | #Code C | #Code D | #Code I |
+----+-------+---------+---------+---------+
|  1 |     2 |       1 |       0 |       1 |
|  2 |     4 |       1 |       2 |       1 |
|  3 |     3 |       1 |       1 |       1 |
|  4 |     3 |       2 |       0 |       1 |
+----+-------+---------+---------+---------+
2 голосов
/ 29 мая 2020

Использовать условное агрегирование:

select id, count(*) as cnt,
       sum(case when code = 'C' then 1 else 0 end) as code_c,
       sum(case when code = 'I' then 1 else 0 end) as code_i,
       sum(case when code = 'D' then 1 else 0 end) as code_d
from t
group by id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...