2012-03-05 48 views
0

如下表結構:如何從表中選擇一組匹配值?

create table SiteFeatures (
    Feature nvarchar(255), 
    SiteUrl nvarchar(255) 
) 

而下面的示例數據:

Feature  SiteUrl 
Feature1 /sites/a/ 
Feature1 /sites/a/l/ 
Feature2 /sites/a/l/ 
Feature3 /sites/a/l/ 
Feature4 /sites/a/l/rd/ 
Feature5 /sites/a/l/rd/ 
Feature6 /sites/a/l/rd/ 
Feature1 /sites/a/pa/ 
Feature2 /sites/a/pa/ 
Feature3 /sites/a/pa/ 
Feature4 /sites/a/pa/rd/ 
Feature5 /sites/a/pa/rd/ 
Feature6 /sites/a/pa/rd/ 
Feature4 /sites/a/s/rd/ 
Feature5 /sites/a/s/rd/ 
Feature6 /sites/a/s/rd/ 
Feature1 /sites/a/s/ 
Feature2 /sites/a/s/ 
Feature3 /sites/a/s/ 

我想檢索功能的每一個獨特的分組(理想情況下這些功能映射到相應的網站) 。鑑於上面的「分組」示例數據我想返回的結果爲:

Feature1 
Feature1, Feature2, Feature3 
Feature4, Feature5 

如果有相應的站點,那麼:

Feature1 = /sites/a/ 
Feature1,Feature2,Feature3 = /sites/a/l/, /sites/a/pa/, /sites/a/s/ 
Feature4,Feature5,Feature6 = /sites/a/l/rd/, /sites/a/pa/rd/, /sites/a/s/rd/ 

我不是太關心返回結果的格式只只要我有所需的羣體/關係返回。

是否有可能在SQL中做到這一點?

+0

您運行的是什麼版本的SQL Server? – 2012-03-05 18:17:00

+0

我想你想看看使用樞軸。 – Trio 2012-03-05 18:19:17

+0

正在使用SQL 2008 R2 – mundeep 2012-03-06 11:00:22

回答

1

如果你在SQL 2005或更高版本,你可以嘗試:

select distinct 
(
    STUFF 
    (
     (
      SELECT ',' + Feature 
      FROM SiteFeatures t2 
      WHERE t1.SiteUrl = t2.SiteUrl 
      ORDER BY Feature 
      FOR XML PATH(''), TYPE, ROOT 
     ).value('root[1]','nvarchar(max)') 
     ,1,1,'' 
    ) 
) as chars 
from SiteFeatures t1; 
+0

謝謝,這很好。你介意打破每一個命令,以便我能理解這是如何工作的?當我試圖將它分解成單獨的組件時,它不會運行(例如,將STUFF分開,然後嘗試FOR XML等)。 – mundeep 2012-03-07 13:01:58

+0

最棘手的部分或者破壞結構是xml值屬性將單個單元格轉換爲表格的事實。我重新格式化了顯示嵌套的答案。 – 2012-03-07 13:40:36

相關問題