[ad_1]
以下は、このような列を持つ SQL のテーブル t1 です。srno は、カーソルを移動するためにのみ使用されるシーケンスです。
acctnum(c1) note (c2) srno 12 abc 1 efd 2 xyz 3 15 pqr 4 16 uio 5 njk 6 uuuwr 7 kmjkj 8 18 zzzzzzz 9
以下のような結果が必要です。それは単一のレコードである必要があります
acctnum(c1) note (c2) 12 abc efd xyz 15 pqr 16 uio njk uuwr kmjkj 18 zzzzzzzzz
私が試したこと:
カーソルクエリの下でそれを取得しようとしましたが、少数のacctnumに対していくつかのメモのレコードを取得していないため、適切に動作しません。 コードを修正して、アカウント番号ごとに適切な単一レコードを取得できるようにしてください。
SQL
SET NOCOUNT ON; declare @accounttNumber varchar(100); declare @note varchar(max); declare @SrNo int; declare @FinalNote varchar(max); declare c1 cursor for SELECT [ACCTNUM],[note],[srno] FROM lk_tmp_data open c1; fetch next from c1 into @accounttNumber,@note,@SrNo; WHILE @@FETCH_STATUS = 0 begin if (@SrNo!='') begin if (@accounttNumber!='') Begin print 'TicketNumber: '+@accounttNumber+' FinalNote : ' + @FinalNote; set @FinalNote = ''; End --else set @FinalNote= @FinalNote + ' ' + @note+' '; end; --SET @SQLQuery =''; --EXEC (@SQLQuery) fetch next from c1 into @accounttNumber,@note,@SrNo; end; CLOSE c1; DEALLOCATE c1;
解決策 1
使用している SQL Server のバージョンが指定されていません。 2017 年以降を想定すると、最も簡単な解決策は次のとおりです。 STRING_AGG[^]:
SQL
SELECT acctnum, STRING_AGG(note, ' ') WITHIN GROUP (ORDER BY srno) As note FROM YourTable GROUP BY acctnum ;
サポートされていない古いバージョンを使用している場合 STRING_AGG
の場合は、ここで説明する代替方法のいずれかを使用する必要があります。
Transact-SQL での行値の連結 – シンプルトーク[^]
解決策 2
それを達成する方法はいくつかあります。
共通テーブル式のサンプルを提供したいと思います。
SQL
;WITH CTE AS ( SELECT 1 Lvl, acctnum, note, srno, note newnote FROM Table1 WHERE acctnum IS NOT NULL UNION ALL SELECT C.Lvl +1, C.acctnum, T.note, T.srno, CONCAT(C.newnote, ' ', T.note) newnote FROM CTE C INNER JOIN Table1 T ON (T.srno - C.srno = 1) AND T.acctnum IS NULL ), FINAL AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY acctnum ORDER BY Lvl DESC) RN FROM CTE ) SELECT acctnum, newnote note FROM FINAL WHERE RN =1
結果:
acctnum note 12 abc efd xyz 15 pqr 16 uio njk uuuwr kmjkj 18 zzzzzzz
[ad_2]
コメント