【解決方法】SQLテーブルの次のレコードからメモをフェッチする必要がある


以下は、このような列を持つ 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

SQL Server 2022 | db<>フィドル[^]

結果:

acctnum 	note
12 	 	 	abc efd xyz
15 	 	 	pqr
16 	 	 	uio njk uuuwr kmjkj
18 	 	 	zzzzzzz

コメント

タイトルとURLをコピーしました