2016-07-06 28 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)。第二個看起來很簡單。 – SMM

+0

爲什麼你需要數據作爲列?如果您只是爲了_display_目的轉換它,在顯示層(報表,網頁,表單等)中比在數據層中更容易。 –

回答

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字段可我已經更新了這個從亞歷克斯納入ROW_NUMBER建議如下

Query example

+0

感謝您的幫助,我仍然有一個問題。我的桌子上沒有任何ID。我該如何解決這個問題?是否有可能在此查詢中構建一些row_number函數? @Paul Ellery – user2210516

+0

你有任何能夠唯一標識每一行的東西嗎? –

+0

更新爲使用ROW_NUMBER() –

1

這可以幫助你,使用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

對不起,我不明白,你是什麼意思? –