2017-03-06 12 views
0

empl_type_multiという名前の列はカンマ区切りの列です。各値は、カスタムキャプションと呼ばれる別の表へのリンクです。例えばTSQL、カンマ区切りの列の値を変更する

、私はempl_type_multiの値として次のものがあります:

123, RHN, 458 

その後custom_captionsテーブルで、これらは個々の値のようになります。

123 = Dog 
RHN = Cat 
458 = Rabbit 

これらのフィールドのすべてがNTEXTです。

123, RHN, 458 

どれ

Dog, Cat, Rabbit 

になる:私が何をしようとしています何

は、上記の例ではので、empl_type_multi列を変換し、custom_captionsテーブル内のそれぞれの名前にそれをチャンスですこれについての助けは大いに感謝されるでしょう。

----- EDIT ---------------------------------------- --------------------------

これで、値を対応するキャプションに変換してすべてを一時テーブルに入れることができました、次はテーブルの上に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

すべてのレコードを削除していることを行うことができる場合------ EDIT --------------- -----------------------------------

最初の編集の解決策は次のとおりです。

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 

次に、影響を受ける行が0になるまでRN = 2をインクリメントしました。私が走った後

この

されました:

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

を削除するためにcase文を使用することができ、これを試してみてくださいデータ構造を正規化する必要があります。 – 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(長さ)として調整して切り捨てを避けてください。私はまた、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 

をループすることにより、容易にCAPTION_NAME文字列を作成し、null値

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