2017-07-15 58 views
0

彙總視圖我有一個sql-server 2012表看起來像這樣:噸-SQL需要從分層數據

lvl | keywords 
-----|------------ 
A | null 
A1 | null 
A1.1 | red, green 
A1.2 | blue 
A1.3 | orange, yellow 
A2 | null 
A2.1 | brown 
A2.2 | black, purple 
B | null 
B1 | null 
B1.1 | pink 
B1.2 | velvet, orange 
B2 | null 
B2.1 | cyan 
B2.2 | purple, white 
etc. 

我需要捲起的關鍵字到較高水平的圖。因此,頂層A必須全部從那裏柱拉特與A級A1開始基礎記錄的關鍵字應該都從那裏柱拉特與A1等,所以這種觀點的輸出應爲開始記錄的關鍵字:

lvl | keywords 
-----|------------ 
A | red, green, blue, orange, yellow, brown, black, purple 
A1 | red, green, blue, orange, yellow 
A1.1 | red, green 
A1.2 | blue 
A1.3 | orange, yellow 
A2 | brown, black, purple 
A2.1 | brown 
A2.2 | black, purple 
B | pink, velvet, orange, cyan, purple, white 
B1 | pink, velvet, orange 
B1.1 | pink 
B1.2 | velvet, orange 
B2 | cyan, purple, white 
B2.1 | cyan 
B2.2 | purple, white 
etc. 

如何在T-SQL中做到這一點? (sql-server 2012)

+0

您將需要大量的字符串處理的做到這一點。如果您可以重新設計您的表格,請爲每個級別設置一些列。所以你的表格將有 - Level1,Level2,Level3,關鍵字作爲列。 在選擇,做3個查詢的工會 - 每個分組的關鍵字在每個級別。合併結果並在刪除重複項後進行最終選擇。 – ArunGeorge

回答

0

對於您所提供的數據,這是一個基本的字符串連接:

select t.*, 
     coalece(t.keywords, 
       stuff((select ', ' + t2.keywords 
         from t2 
         where t2.lvl like t.lvl + '%' and 
          t2.lvl <> t.lvl and 
          t2.keywords is not null 
         for xml path ('') 
        ), 1, 2, '' 
        ) 
       ) as keywords 
from t; 

我要提醒你,雖然,存儲在逗號分隔領域的關鍵詞通常是一個非常糟糕的主意。你應該重新考慮你的數據結構。

+0

謝謝,它的工作原理,有輕微的調整:coalece(t.lvl,應該是COALESCE(t.keywords, 爲什麼是一個壞主意,關鍵字存儲在分隔的領域逗號會分號;是?更好的分隔符?還是有其他原因? THX,羅布 – emphyrio