2015-09-25 27 views
0

我試圖摺疊維護層次結構的表。SQL Server:將文本行摺疊爲一行或多行

我正在使用SQL Server 2008 R2。

數據看起來像這樣。 ID是唯一的:

ID Country City  District   Street   amount 
------------------------------------------------------------------ 
1 USA  New York NULL    NULL   1 
1 USA  New York Manhattan   NULL   1 
2 EU  Paris  NULL    NULL   1 
2 EU  Paris  arrondissement II NULL   1 
2 EU  Paris  arrondissement II Rue Vivienne 1 
2 EU  Paris  arrondissement IV NULL   1 
2 EU  Paris  arrondissement IV Rue de Rivoli 1 

這樣:

ID Country City  District   Street  amount 
------------------------------------------------------------ 
1 USA  New York Manhattan   NULL   1 
2 EU  Paris  arrondissement II Rue Vivienne 1 
2 EU  Paris  arrondissement IV Rue de Rivoli 1 

示例代碼:

create table DataTab 
(
    ID [varchar](10), 
    Country [varchar](10), 
    City [varchar](10), 
    District [varchar](50), 
    Street [varchar](50), 
    amount [int] 
); 

Insert into DataTab 
values (1, 'USA', 'New York', NULL, NULL, 1); 

Insert into DataTab 
values (1, 'USA', 'New York', 'Manhattan', NULL, 1); 

Insert into DataTab 
values (2, 'EU', 'Paris', NULL, NULL, 1); 

Insert into DataTab 
values (2, 'EU', 'Paris', 'arrondissement II', NULL, 1); 

Insert into DataTab 
values (2, 'EU', 'Paris', 'arrondissement II', 'Rue Vivienne', 1); 

Insert into DataTab 
values (2, 'EU', 'Paris', 'arrondissement IV', NULL, 1); 

Insert into DataTab 
values (2, 'EU', 'Paris', 'arrondissement IV', 'Rue de Rivoli', 1); 

select * from DataTab; 

我試圖解決使用CTE的問題,但不知何故,我無法找到一個可行的解決方案。

希望你有時間幫忙。

+0

使用'CTE'顯示您的查詢。 – Wanderer

+0

當Id 2有5行時,你的意思是「Id是否唯一」? –

回答

2

它可能不是解決此類問題的標準方式,而是嘗試此查詢:

SELECT ID 
    ,Country 
    ,City 
    ,District 
    ,Street 
    ,amount 
FROM (
    SELECT * 
     ,max(score) OVER (PARTITION BY id) max_score 
    FROM (
     SELECT * 
      ,CASE WHEN Country IS NOT NULL THEN 1 ELSE 0 END + 
      CASE WHEN City IS NOT NULL THEN 1 ELSE 0 END + 
      CASE WHEN District IS NOT NULL THEN 1 ELSE 0 END + 
      CASE WHEN Street IS NOT NULL THEN 1 ELSE 0 END + 
      CASE WHEN amount IS NOT NULL THEN 1 ELSE 0 END score 
     FROM DataTab 
     ) result_set 
    GROUP BY ID 
     ,Country 
     ,City 
     ,District 
     ,Street 
     ,amount 
     ,score 
    ) result_set 
WHERE score = max_score 

您還可以找到一個樣本SQLFiddle here

+0

這件作品魅力。非常感謝你花時間幫助我。 – Kirsten

+0

@Kirsten不客氣,這就是我們來這裏#SOreadytohelp的原因 –