2016-01-05 43 views
1

我試圖連接paramsNote中存在的值,只要其他列中的數據相同即可。填寫所有其他列中的數據時一列的數據相同

當在一列數據的AppID,行動寫到FileID,ID,BaseVehicleID,ParttypeID,SubModelID是相同,則只有級聯這些PARAMS並注意 別的不是,並將其顯示爲在輸出個別記錄。

的樣本數據:

DECLARE @TABLE TABLE 
(
AppID INT, 
FileID INT, 
Action CHAR (1),  
ID INT, 
BaseVehicleID INT, 
ParttypeID INT, 
SubModelID INT, 
Params VARCHAR (50),  
Note VARCHAR (50) 
) 
INSERT @TABLE 

SELECT 2, 1, 'A', 2, 4935, 5560,'' , 'check1', 'M14 x 1.50 Thread' UNION ALL 

SELECT 2, 1, 'A', 2, 4935, 5560,'' , 'check2', 'Package Quantity: 5' UNION ALL 

SELECT 2, 1, 'A', 2, 4935, 5569,'',  '' ,'Dorman - AutoGrade - Boxed' 

期望輸出

2 1 A 2 4935 5560 0 check1;check2 M14 x 1.50 Thread;Package Quantity: 5 

2 1 A 2 4935 5569 0     Dorman - AutoGrade - Boxed 
+0

這是特別不容易在SQL Server做。此外,這基本上是反規範化你的數據庫表。你爲什麼想這樣做? –

+0

@TimBiegeleisen @TimBiegeleisen:我的記錄數是巨大的數百萬,除了params和note,其他列中的值都是相同的 所以我試圖減少記錄數,填充參數和注意當所有其他列中的值相同時。 –

+0

[如何使用GROUP BY連接SQL Server中的字符串?](http://stackoverflow.com/questions/273238/how-to-use-group-by-to-concatenate-strings-in-sql -服務器) – trincot

回答

1

像這樣的東西應該做的伎倆:

;WITH DataSource AS 
(
    -- columns on which we are grouping 
    SELECT DISTINCT [AppID] 
        ,[FileID] 
        ,[Action] 
        ,[ID] 
        ,[BaseVehicleID] 
        ,[ParttypeID] 
        ,[SubModelID] 
    FROM @TABLE 
) 
SELECT * 
FROM DataSource DS 
CROSS APPLY 
(
    SELECT STUFF 
     (
      (
      SELECT DISTINCT ';' +[Params] 
      FROM @TABLE T 
      WHERE T.[AppID] = DS.[AppID] 
       AND T.[FileID] = DS.[FileID] 
       AND T.[Action] = DS.[Action] 
       AND T.[ID] = T.[ID] 
       AND T.[BaseVehicleID] = DS.[BaseVehicleID] 
       AND T.[ParttypeID] = DS.[ParttypeID] 
       AND T.[SubModelID] = DS.[SubModelID] 
       AND [Params] <> '' 
       FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
      ,1 
      ,1 
      ,'' 
     ) 

) DS1([Params]) 
CROSS APPLY 
(
    SELECT STUFF 
     (
      (
      SELECT DISTINCT ';' +[Note] 
      FROM @TABLE T 
      WHERE T.[AppID] = DS.[AppID] 
       AND T.[FileID] = DS.[FileID] 
       AND T.[Action] = DS.[Action] 
       AND T.[ID] = T.[ID] 
       AND T.[BaseVehicleID] = DS.[BaseVehicleID] 
       AND T.[ParttypeID] = DS.[ParttypeID] 
       AND T.[SubModelID] = DS.[SubModelID] 
       FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
      ,1 
      ,1 
      ,'' 
     ) 
) DS2 ([Note]) 

enter image description here

請注意,如果您有多個要分組的列,則這可能變得更加複雜。對於聚合連接功能,沒有T-SQL本機實現,但是如果您想使用SQL CLR,則可以實現此類功能。 This answer包含您需要的一切。如果實現這樣的功能,該解決方案將是這樣的:

enter image description here

0
DECLARE @TABLE TABLE 
(
AppID INT, FileID INT,Action CHAR (1), ID INT, BaseVehicleID INT, ParttypeID INT, SubModelID INT, Params VARCHAR (50),  
Note VARCHAR (50)) 

INSERT @TABLE 

SELECT 2, 1, 'A', 2, 4935, 5560,'' , 'check1', 'M14 x 1.50 Thread' UNION ALl 
SELECT 2, 1, 'A', 2, 4935, 5560,'' , 'check2', 'Package Quantity: 5' UNION ALl 
SELECT 2, 1, 'A', 2, 4935, 5560,'',  '' ,'Dorman - AutoGrade - Boxed' 

select *from @table 



select AppID, FileID, [Action],ID, BaseVehicleID, ParttypeID, SubModelID, 
STUFF(
      (SELECT ';' + Params 
      from @TABLE 
      group by AppID, FileID, [Action],ID, BaseVehicleID, ParttypeID, SubModelID,Params 
      FOR XML PATH('')),1,2,'') AS Params, 
      STUFF(
      (SELECT ';' + Note 
      from @TABLE 
      group by AppID, FileID, [Action],ID, BaseVehicleID, ParttypeID, SubModelID,Note 
      FOR XML PATH('')),1,1,'') AS Note 

from @table 
group by AppID, FileID, [Action],ID, BaseVehicleID, ParttypeID, SubModelID 
相關問題