2016-07-06 17 views
1

結果を得るためにこのクエリを書き直す方法を教えてもらえますか?私の結果を文字列として水平に書く

1 2 3 4 5 
U.T A.H E.Z R.Z S.A 

時には、5つ以上の結果が返されます。

enter image description here

マイクエリ:

SELECT 
    LEFT(a.Vorname, 1) + '.' + LEFT(a.Name, 1) AS Name 
FROM 
    ADR_Adressen a 
LEFT JOIN 
    ADR_GruppenLink gl ON gl.AdressNrADR = a.AdressNrADR 
WHERE 
    a.Z_Klasse = 'BA' AND gl.GruppeADR != 'KIND' 
+1

いくつかのアイデア[ここ](http://stackoverflow.com/questions/194852/concatenate-many-rows-into-a-single-text-string)を見てみてください。第2のものは十分に単純です。 – SMM

+0

なぜデータを列として必要としますか?表示レイヤ(レポート、Webページ、フォームなど)の方がデータレイヤーよりもずっと簡単です。 –

答えて

1

行の数が可変である場合、これを行うにはかなりの方法はありません。

これは、このquestionの回答に大きく依存しています。実行する前にクエリを動的に構築する必要があります。

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

-- Build a list of ids for each of the selected rows 
SELECT @cols = STUFF((SELECT ',[' + convert(varchar,ROW_NUMBER() OVER (ORDER BY LEFT([vorname],1),LEFT([Name],1) ) ) + ']' 
    FROM #ADR_Adressen 
    LEFT JOIN ADR_GruppenLink gl ON gl.AdressNrADR = a.AdressNrADR 
    WHERE a.Z_Klasse = 'BA' AND gl.GruppeADR != 'KIND' 
    FOR XML PATH(''), TYPE 
    ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 

-- Build a query using the list of IDs selected above. These are pivotted into column names 

set @query = N'SELECT ' + @cols + N' from 
      (
      select 
       ROW_NUMBER() OVER (ORDER BY LEFT([vorname],1),LEFT([Name],1) ) ID, 
       LEFT(vorname,1) + ''.'' + LEFT(Name,1) Name 
      from #ADR_Adressen a 
      LEFT JOIN ADR_GruppenLink gl ON gl.AdressNrADR = a.AdressNrADR 
      WHERE a.Z_Klasse = 'BA' AND gl.GruppeADR != 'KIND' 
      ) x 
      pivot 
      (
       max(Name) 
       for ID in (' + @cols + N') 
      ) p 

      ' 

exec sp_executesql @query; 

更新:使用して、何のIDフィールドは、私が

Query example

+0

あなたの助けてくれてありがとう、私はまだ1つの問題があります。私はテーブルにIDを持っていません。どうすればこの問題を解決できますか?いくつかのrow_number関数をこのクエリに組み込むことは可能ですか? @ Paul Ellery – user2210516

+0

各行を一意に識別できるものはありますか? –

+0

ROW_NUMBER()を使用するように更新 –

1

これはあなたを助けることができるの下にアレックスからROW_NUMBERの提案を組み込むために、これを更新しました利用できないことを考えるとROW_NUMBER()

DECLARE @cols AS NVARCHAR(MAX) 


SELECT @cols = STUFF((SELECT ',[' + convert(varchar,ROW_NUMBER() OVER (ORDER BY LEFT(a.[Name],1) ) )+ ']' AS ID 
FROM [ADR_Adressen] a 

FOR XML PATH(''), TYPE).value('.', 'varchar(max)'),1,1, '') 


DECLARE @query AS NVARCHAR(MAX); 

SET @query = N'SELECT ' + @cols + N' from 
      (
      SELECT ROW_NUMBER() OVER (ORDER BY LEFT(a.Name,1) ) AS ID, 
      LEFT(vorname,1) + ''.'' + LEFT(Name,1) Name 
       from ADR_Adressen a 
       LEFT JOIN ADR_GruppenLink gl ON gl.AdressNrADR = a.AdressNrADR 
       WHERE a.Z_Klasse = 'BA' AND gl.GruppeADR != 'KIND' 
      ) x 
      pivot 
      (
       max(Name) 
       for ID in (' + @cols + N') 
      ) p 

      ' 
exec sp_executesql @query; 
+1

コードをコピー&ペーストする際にソースを引用してください! – Heinzi

+0

申し訳ありませんが理解できません、どういう意味ですか? –

関連する問題