我在一个表中组织的数据如下:
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
计数是名称在记录中出现的次数。这可能吗?
答案 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;
答案 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]