Sql 如何对表中的列中的相同Id进行计数,并基于计数执行串联
我有一张表格,格式如下 身份证名称 1阿米特 2莫希特 2纳哈尔 我的要求是获得一个将此表更新为以下格式的查询 身份证名称 1阿米特 2莫希特或纳哈尔Sql 如何对表中的列中的相同Id进行计数,并基于计数执行串联,sql,tsql,Sql,Tsql,我有一张表格,格式如下 身份证名称 1阿米特 2莫希特 2纳哈尔 我的要求是获得一个将此表更新为以下格式的查询 身份证名称 1阿米特 2莫希特或纳哈尔 SQL中是否有任何查询可以解决此问题?您可以尝试类似的方法来连接名称 DECLARE @Table TABLE( ID INT, NAME VARCHAR(MAX) ) DECLARE @TempTable TABLE( ID INT, NAME VARCHAR(MA
SQL中是否有任何查询可以解决此问题?您可以尝试类似的方法来连接名称
DECLARE @Table TABLE(
ID INT,
NAME VARCHAR(MAX)
)
DECLARE @TempTable TABLE(
ID INT,
NAME VARCHAR(MAX)
)
INSERT INTO @Table (ID,[NAME]) SELECT 1, 'A'
INSERT INTO @Table (ID,[NAME]) SELECT 2, 'B'
INSERT INTO @Table (ID,[NAME]) SELECT 2, 'C'
DECLARE @ID INT
DECLARE Cur CURSOR FOR
SELECT DISTINCT
ID
FROM @Table
OPEN Cur
FETCH NEXT FROM Cur INTO @ID
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @Name VARCHAR(MAX)
SET @Name = NULL
SELECT @Name = COALESCE(@Name + ' OR ' + NAME, Name)
FROM @Table
WHERE ID = @ID
INSERT INTO @TempTable (ID,[NAME]) SELECT @ID, @Name
FETCH NEXT FROM Cur INTO @ID
END
CLOSE Cur
DEALLOCATE Cur
SELECT * FROM @TempTable
试试这个
DECLARE @Table TABLE(
ID INT,
NAME VARCHAR(MAX)
)
INSERT INTO @Table (ID,[NAME]) SELECT 1, 'Amit'
INSERT INTO @Table (ID,[NAME]) SELECT 2, 'Mohit'
INSERT INTO @Table (ID,[NAME]) SELECT 2, 'Nahar'
INSERT INTO @Table (ID,[NAME]) SELECT 3, 'C'
INSERT INTO @Table (ID,[NAME]) SELECT 3, 'D'
INSERT INTO @Table (ID,[NAME]) SELECT 3, 'E'
查询(第一次查询)
输出:
id MergedData
1 Amit
2 Mohit OR Nahar
id MergedData
1 Amit
2 Mohit OR Nahar
3 C AND D AND E
查询(更改请求)
谢谢,我正在尝试这个!!其他一些方法也使用CTE。你能告诉我CTE比游标快吗?我想你需要运行一些测试来检查这个。我发现递归CTE函数在达到deap后会变慢。这个链接非常有用,非常感谢!!!你能解释一下这个问题吗?我想这对我有帮助。提前感谢……:)我使用For Xml path来组合Mohit、Nahar等项。查询非常简单。我根据相似id的“b.id=a.id”拾取并组合名称,然后使用填充函数删除第一个“,”因为原始列表将是“,”Mohit,Nahar“,然后使用替换函数将“,”替换为或。看看这里,了解一下xml路径的另一个查询,我有一个条件,如果count(Id)=2,则连接或到名称,但如果count(Id)>2,则连接和。如果你能帮上忙,那就太好了。。。
select distinct a.id,
case when coalesce(x.cnt,0) <= 2 then
REPLACE(stuff((select ',' + ' ' + name + ' '
from @Table b
where b.id = a.id
FOR xml path('')),1,1,' '),',','OR')
when x.cnt > 2 then
REPLACE(stuff((select ',' + ' ' + name + ' '
from @Table b
where b.id = a.id
FOR xml path('')),1,1,' '),',','AND')
end
MergedData
from @Table a
left join
(select id,COUNT(id) cnt
from @Table
group by ID
having (COUNT(id)>1))x
on a.ID = x.ID
id MergedData
1 Amit
2 Mohit OR Nahar
3 C AND D AND E