2016-12-02 138 views
1

我有如下數據:SQL Server的SQL語句 - 更新記錄

enter image description here

我需要使用column id, region, company, dept, subdept and amountsepend更新Matching_idMatching_Type。邏輯是:

Sum AmountSepend by Region, Company, Dept and SubDept。如果總金額爲0,那麼Matching_Type是'匹配',而Matching_id是匹配記錄的ID的組合,否則'不匹配'且Matching_id是ID。 ** SUM表示不論AmountSepend是正數還是負數,對於相同條件的所有記錄的總數。

另一個重要的標準是,如果該事務是單個記錄,通過各地區分組意總計數,公司,DEPT和SubDept爲1,則相配的類型不匹配,Matching_UID是ID不管AmountSepend是0或正/負值。實例ID 8

下面是輸出:

enter image description here

這裏的表和數據的腳本

CREATE TABLE [dbo].[StackoverflowQuest](
[id] [int] NOT NULL, 
[Region] [varchar](50) NULL, 
[Company] [varchar](50) NULL, 
[Dept] [varchar](50) NULL, 
[SubDept] [varchar](50) NULL, 
[AmountSepend] [float] NULL, 
[Matching_id] [varchar](100) NULL, 
[Matching_Type] [varchar](100) NULL 
) ON [PRIMARY] 

我怎麼能取得這樣的結果?任何幫助/暗示將不勝感激

+0

你還在尋找解決方案嗎? – andrews

回答

0
CREATE TABLE #Table(Id INT,Region VARCHAR(100),Company INT,Dept INT,SubDept  
INT,AmtSpend INT,MatchingId VARCHAR(100),MatchingType VARCHAR(100)) 

INSERT INTO #Table(Id ,Region ,Company , Dept ,SubDept ,AmtSpend) 
SELECT 1,'NAM',12378,1,NULL,900 UNION ALL 
SELECT 2,'NAM',12378,1,NULL,-900 UNION ALL 
SELECT 3,'NAM',12370,1,23,1000 UNION ALL 
SELECT 4,'ASA',1234,9,12,5000 UNION ALL 
SELECT 5,'NAM',12370,1,23,-1000 UNION ALL 
SELECT 6,'ASA',1234,9,12,800 UNION ALL 
SELECT 7,'ASA',1234,9,12,-600 UNION ALL 
SELECT 8,'ASA',12311,6,NULL,200 

UPDATE #Table SET MatchingId = MatchIds,MatchingType = 'Match' 
FROM 
(
    SELECT T2.Company,STUFF((SELECT ',' + CAST(T3.Id AS VARCHAR) FROM #Table  
    T3 WHERE T2.Company = T3.Company FOR XML PATH('')),1,1,'') MatchIds 
    FROM #Table T2 
    JOIN 
    (
    SELECT T1.Company Company,SUM(T1.AmtSpend) Total 
    FROM #Table T1 
    GROUP BY T1.Company 
    HAVING SUM(T1.AmtSpend) = 0 
)A ON A.Company = T2.Company 
    GROUP BY T2.Company 
) A 
WHERE A.Company = #Table.Company 


UPDATE #Table SET MatchingId = CAST(Id AS VARCHAR),MatchingType = 'Not 
Match' WHERE ISNULL(MatchingId,'') = '' 

SELECT * FROM #Table 
+0

你確定你的代碼能正常工作,當相同部門的負數分成2個或更多的記錄時不是900 vs -900而是900 vs(-600和-300)?您只能將2個值添加到MatchIds列中。 – andrews

+0

查看上面的用戶需要的輸出。他們不需要總和負值。他們只檢查正值和負值。 – Mansoor

+0

「按地區,公司,部門和子部門劃分的總金額」 - 對我來說,總和意味着相同標準的所有記錄的總和,而不是僅爲2的總和。只有1個正面和1個負面記錄僅僅是一個簡化的情況一個普通的任務。但是,讓OP澄清。 – andrews