Как посчитать тот же Id в столбце в таблице и на основе подсчета выполнить конкатенацию - PullRequest
0 голосов
/ 02 декабря 2009

У меня есть таблица в формате ниже

ИД 1 Амит 2 Мохит 2 Нахар

Мое требование - получить запрос, который обновит эту таблицу до следующего формата

ИД 1 Амит 2 Мохит ИЛИ НАХАР

Есть ли какой-либо запрос в SQL, который может решить эту задачу?

Ответы [ 2 ]

1 голос
/ 02 декабря 2009

Вы можете попробовать что-то вроде этого, чтобы объединить имена.

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
0 голосов
/ 02 декабря 2009

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

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'

Запрос (для первого запроса)

select id,
        REPLACE(stuff((select ',' + '  ' + name  + '  ' 
            from @Table b
            where b.id = a.id
            FOR xml path('')),1,1,' '),',','OR') MergedData
from @Table a
group by a.id 

Выход:

id  MergedData
1      Amit  
2      Mohit  OR  Nahar

Запрос (для запроса на изменение)

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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...