2017-03-06 50 views
0

我有一個名爲empl_type_multi的列,它只是逗號分隔的列,每個值都是指向另一個稱爲自定義標題的表的鏈接。TSQL,在逗號分隔列上更改值

例如,我可能有以下作爲empl_type_multi值:

123, RHN, 458 

然後在custom_captions表這些是單個值:

123 = Dog 
RHN = Cat 
458 = Rabbit 

所有這些領域都是NTEXT。

什麼,我試圖做的是轉換empl_type_multi列,在上面的例子中它有機會在custom_captions表中各自的名稱,所以:

123, RHN, 458 

將成爲

Dog, Cat, Rabbit 

任何對此的幫助將不勝感激。

-----編輯---------------------------------------- --------------------------

好吧,所以我設法將這些值轉換爲相應的標題,並將它們全部放到臨時表中,以下是從CTE查詢的輸出放在桌子上:

ID1  ID2  fName lName Caption_name  Row_Number 
10007 22841 fname1 lname1 DENTAL ASSISTANT 1 
10007 22841 fname1 lname1      2 
10007 22841 fname1 lname1      3 
10008 23079 fname2 lname2 OPS WARD   1 
10008 23079 fname2 lname2 DENTAL    2 
10008 23079 fname2 lname2      3 

使下標題名稱,也被添加到用逗號分隔ROW_NUMBER 1的標題名稱我怎麼能更新嗎?

如果我能做到這一切,我需要做的就是刪除所有記錄ROW_NUMBER!= 1

------編輯--------------- -----------------------------------

第一次編輯的解決方案是:

WITH CTE AS 
(
    SELECT 
     p.ID1 
     , p.ID2 
     , p.fname 
     , p.lname 
     , p.caption_name-- 
     , ROW_NUMBER() OVER (PARTITION BY p.id1ORDER BY caption_name DESC) AS RN 
    FROM tmp_cs p 
) 
UPDATE tblPerson SET empType = empType + ', ' + c.Data 
FROM CTE c WHERE [DB1].dbo.tblPerson.personID = c.personID AND RN = 2 

然後我只是遞增RN = 2,直到我得到0行受影響。

這之後,我跑:

DELETE FROM CTE WHERE RN != 1 AND Caption_name = '' 
+4

這聽起來像循環容易構建CAPTION_NAME串你需要規範你的數據結構。 – artm

+0

這不是我的數據庫,我被給了它,並被告知將這些數據導出到Excel電子表格中。 –

回答

1
select ID1, ID2, fname, lname, left(captions, len(captions) - 1) as captions 
from (
    select distinct ID1, ID2, cast(fname as nvarchar) as fname, cast(lname as nvarchar) as lname, (
     select cast(t1.caption_name as nvarchar) + ',' 
     from #temp as t1 
     where t1.ID1 = t2.ID1 
     and t1.ID2 = t2.ID2 
     and cast(caption_name as nvarchar) != '' 
     order by t1.[row_number] 
     for xml path ('')) captions 
    from #temp as t2 
) yay_concatenated_rows 

這會給你想要的東西。你會看到從ntext轉換爲varchar。這是比較必要的,因爲許多邏輯運算符不能在ntext上執行。它可以隱式地退回另一種方式,所以不用擔心。請注意,投射時我沒有指定長度;這將默認爲30,因此根據需要調整爲varchar(length)以避免截斷。我還假設ID1和ID2形成一個組合鍵(看起來如此)。根據您需要的關係調整連接。

+0

嗨,感謝您的迴應,我在我看到這篇文章之前就想出了一個不那麼優雅的方法,它在上面的編輯中。 –

1

你剛剛分享了你的問題,而不是確切的問題。

試試這個,

DECLARE @T TABLE(ID1 VARCHAR(50),ID2 VARCHAR(50),fName VARCHAR(50),LName VARCHAR(50),Caption_name VARCHAR(50),Row_Number INT) 
INSERT INTO @T VALUES 
(10007,22841,'fname1','lname1','DENTAL ASSISTANT', 1) 
,(10007,22841,'fname1','lname1', NULL,     2) 
,(10007,22841,'fname1','lname1', NULL,     3) 
,(10008,23079,'fname2','lname2','OPS WARD',   1) 
,(10008,23079,'fname2','lname2','DENTAL',    2) 
,(10008,23079,'fname2','lname2', NULL,     3) 

SELECT * 
,STUFF((SELECT ','+Caption_name 
FROM @T T1 WHERE T.ID1=T1.ID1 FOR XML PATH('') 
),1,1,'') 
FROM @T T 
1

您可以通過while循環

declare @i int = 2,@Caption_name varchar(100)= (select series from 
#temp where Row_Number= 1) 
while @i <= (select count(*) from #temp) 
begin 
select @Caption_name = @Caption_name + Caption_name from #temp where Row_Number = @i) 
set @i = @i+1 
end 
update #temp set Caption_name = @Caption_name where Row_Number = 1 

和使用案例語句刪除空值

(select case when isnull(Caption_name ,'') = '' then 
'' else ',' + Caption_name end