计算连续多少个字段相同

时间:2019-10-15 09:32:04

标签: sql sql-server

我在一个表中组织的数据如下:

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 个答案:

答案 0 :(得分:1)

这里遇到问题的真正原因是因为您对数据进行了非规范化。而不是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];

答案 1 :(得分:0)

使用联合方法:

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

Demo

答案 2 :(得分:0)

尝试一下:

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]