Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何对表中的列中的相同Id进行计数,并基于计数执行串联_Sql_Tsql - Fatal编程技术网

Sql 如何对表中的列中的相同Id进行计数,并基于计数执行串联

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

我有一张表格,格式如下

身份证名称 1阿米特 2莫希特 2纳哈尔

我的要求是获得一个将此表更新为以下格式的查询

身份证名称 1阿米特 2莫希特或纳哈尔


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