Подсчет, сколько полей одинаковы в строке - PullRequest
0 голосов
/ 15 октября 2019

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

ID, name1, name2, name3, name4, name5, name6

Пример данных

select ID, name1, name2, name3, name4, name5, name6
from datatable

123, bob, mark, jane, bob, jane, fred  
124, mark, mark, mark, bob, bob, bob

, и мне нужно получить что-то вроде

123, bob,  2  
123, mark, 1  
123, jane, 2  
123, fred, 1  
124, mark, 3  
124, bob,  3  

Где количество - это количество раз, когда имя появляется в записи. Это возможно?

Ответы [ 3 ]

1 голос
/ 15 октября 2019

Настоящая причина, по которой у вас возникла проблема, заключается в том, что у вас есть нормализованные данные. Вместо 6 столбцов «Имя» у вас должен быть 1 столбец (называемый [Name]), а затем еще один столбец для обозначения «числа» (ID?).

Однако вы можете сделать это на лету, используя VALUES Чтобы удалить ваши данные, а затем выполнить COUNT, но я настоятельно рекомендую вам в долгосрочной перспективе исправить дизайн таблицы:

SELECT DT.ID,
       V.[Name],
       COUNT(V.[Name]) AS Names
FROM dbo.DataTable DT
     CROSS APPLY (VALUES(DT.name1),DT.(name2),(DT.name3),(DT.name4),(DT.name5),(DT.name6))V([Name])
GROUP BY DT.ID,
         V.[Name];
0 голосов
/ 15 октября 2019

Попробуйте это:

declare @tbl table (ID int, name1 varchar(10), name2 varchar(10), name3 varchar(10), name4 varchar(10), name5 varchar(10), name6 varchar(10))
insert into @tbl values
(123, 'bob', 'mark', 'jane', 'bob', 'jane', 'fred'),  
(124, 'mark', 'mark', 'mark', 'bob', 'bob', 'bob')

select id, [name], count(*) cnt from (
    select ID, name1 [name] from @tbl
    union all
    select ID, name2 from @tbl
    union all
    select ID, name3 from @tbl
    union all
    select ID, name4 from @tbl
    union all
    select ID, name5 from @tbl
    union all
    select ID, name6 from @tbl
) a group by id, [name]
0 голосов
/ 15 октября 2019

Используя объединенный подход:

WITH cte AS (
    SELECT ID, name1 AS name FROM yourTable UNION ALL
    SELECT ID, name2 FROM yourTable UNION ALL
    SELECT ID, name3 FROM yourTable UNION ALL
    SELECT ID, name4 FROM yourTable UNION ALL
    SELECT ID, name5 FROM yourTable UNION ALL
    SELECT ID, name6 FROM yourTable
)

SELECT
    ID,
    name,
    COUNT(*) AS Count
FROM cte
GROUP BY
    ID,
    name
ORDER BY
    ID,
    name;

enter image description here

Демо

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