2016-10-20 36 views
-1

我有表風險和歷史表風險歷史。 在風險表,我有數據象下面這樣:如何在sql server中收集數據到單行

----------------------------- 
| ID | DealID | Description | 
----------------------------- 
| 1 | 14  | Risk1  | 
----------------------------- 
| 2 | 14  | Risk2  | 
----------------------------- 
| 3 | 14  | Risk3  | 
----------------------------- 
| 4 | 15  | Risk4  | 
----------------------------- 

所以這裏我們可以看到,一個交易可以有一些風險。我需要保存表的數據在歷史風險象下面這樣:

------------------------------------- 
| ID | dealID | AllDescriptions | 
------------------------------------- 
| 1 | 14  | Risk1, Risk2, Risk3 | 
------------------------------------- 
| 2 | 15  | Risk4    | 
------------------------------------- 

我需要觸發,將做到這一點。但現在我不能。

我如何從幾行收集數據到一行?

編輯:

我需要觸發的,所以現在我有以下觸發:

 INSERT INTO [dbo].[Risks_history] 
     (
      DealID, 
      [AllDescription] 
    ) 
     SELECT 
      [DealID], 
      stuff((select ',' + i.name from inserted i 
        where i.DealID= i2.DealID 
        FOR XML PATH('')),1,1,'') as Description           
     FROM inserted i2; 

但在表Risks_history我有數據(觸發寫)象下面這樣:

- When I change Risk1: 

    ------------------------------------- 
    | ID | dealID | AllDescriptions | 
    ------------------------------------- 
    | 1 | 14  | Risk1, Risk1, Risk1 | 
    ------------------------------------- 

- When I change Risk2: 

------------------------------------- 
| ID | dealID | AllDescriptions | 
------------------------------------- 
| 1 | 14  | Risk2, Risk2, Risk2 | 
------------------------------------- 

- When I change Risk3: 

------------------------------------- 
| ID | dealID | AllDescriptions | 
------------------------------------- 
| 1 | 14  | Risk3, Risk3, Risk3 | 
------------------------------------- 

但我需要寫出所有風險,無論風險如何變化

+1

集團通過再使用的東西或子 –

+0

我試過了。但不能 –

+0

結帳我的回答 –

回答

1

請試試這個..

SELECT DISTINCT 
     DealID 
    , STUFF((
     SELECT N', ' + CAST([Description] AS VARCHAR(4000)) 
     FROM Risks R2 
     WHERE R1.DealID = R2.DealID 
     FOR XML PATH (''), TYPE), 1, 2, '') AS AllDescriptions 
FROM Risks R1 
GROUP BY DealID 

修改後的觸發,並假設DealID和描述風險表的列名,

DECLARE @DealID INT; 

SELECT 
    @DealID = [DealID]           
FROM inserted; 

INSERT INTO [dbo].[Risks_history] 
     (
      DealID, 
      [AllDescription] 
    ) 
     SELECT 
      [DealID], 
      STUFF((
       SELECT ', ' + R2.[Description] 
       FROM Risks R2 
       WHERE R1.DealID = R2.DealID 
       FOR XML PATH (''), TYPE), 1, 2, '') AS AllDescriptions           
     FROM Risks R1 
     WHERE DealID = @DealID 
    GROUP BY DealID 
+0

你能否按照已修改的問題重寫你的答案 –

+0

我已經更新了你的觸發器。如果不工作,請附上表風險記錄 –

+0

它不起作用。我給你提供了以上表格中的數據示例 –

2
create table #c 

(ID int, DealID int, Description varchar(10)) 
insert into #c values 
(1,14,'Risk1'), 
(2,14,'Risk2'), 
(3,14,'Risk3'), 
(4,15,'Risk4') 

SELECT DISTINCT DealID, 
       STUFF((SELECT ','+Description 
         FROM #c t1 
         WHERE t1.DealID = t2.DealID 
         FOR XML PATH('')) 
         ,1,1,'') as Description 
FROM #c t2 
+0

你能重寫你的答案,因爲修改的問題 –

2

試試這個,

SELECT 
    ID, 
    STUFF((
    SELECT ', ' + CAST(Description AS VARCHAR(MAX)) 
    FROM Risks 
    WHERE (ID = RiskMain.ID) 
FOR XML PATH (''), TYPE), 1, 2, '') AS AllDescriptions 
FROM Risks RiskMain 
GROUP BY ID 
+0

你能否按照修改後的問題 –

1
DECLARE @tblTest AS TABLE 
(
    ID INT, 
    DealID INT, 
    Description VARCHAR(50) 
) 

INSERT INTO @tblTest VALUES(1,14,'Risk1') 
,(2,14,'Risk2') 
,(3,14,'Risk3') 
,(4,15,'Risk4') 

SELECT STUFF((SELECT distinct ',' + QUOTENAME(Description) 
      FROM @tblTest c 
      --WHERE c.DealID=T.DealID 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

SELECT 
    ROW_NUMBER() OVER (ORDER BY MAX(T.ID)) AS ID, 
    T.DealID, 
    (SELECT STUFF((SELECT distinct ',' + Description 
      FROM @tblTest c 
      WHERE c.DealID=T.DealID 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'')) AS AllDescriptions 
FROM @tblTest T 
GROUP BY T.DealID 
+0

重寫你的答案你能否按照修改的問題重寫你的答案 –

0

我們所用的ID和DealID在GROUP使用MIN BY:

SELECT MIN(u.ID) AS ID, 
    u.DealID, 
    STUFF((SELECT ', ' + A.Description FROM Mytable A 
    WHERE A.DealID=u.DealID FOR XML PATH('')),1,1,'') As [Description] 
FROM Mytable u 
GROUP BY u.DealID 
+0

你能否重寫你的答案修改問題 –

1

你可以得到如下的輸出與一個單一的SQL查詢是這樣的:

SELECT t1.DealID, 
Descriptions =REPLACE((SELECT Description AS [data()] 
FROM Risks_history t2 
WHERE t2.DealID = t1.DealID 
ORDER BY Description 
FOR XML PATH('') 
), ' ', ',') 
FROM Risks_history t1 
GROUP BY DealID ; 

現在,你必須把這個查詢下將過濾器數據插入到表中的觸發器。

enter image description here

+0

您能否根據已修改的問題重寫您的答案 –

相關問題