2016-12-02 5 views
1

以下のように私は、データを持っている:私はcolumn id, region, company, dept, subdept and amountsependを使用してMatching_idMatching_Typeを更新する必要がSQL ServerのSQLステートメント - 更新記録

enter image description here

。論理は:

Sum AmountSepend by Region, Company, Dept and SubDeptです。合計金額が0の場合、Matching_Typeは 'Match'であり、Matching_idは一致したレコードのidと 'Not Match'の組み合わせであり、Matching_idはidです。 ** SUMは、AmountSependが正または負であっても、同じ基準のすべてのレコードの合計を意味します。

もう1つの重要な基準は、トランザクションが単一レコードである場合です。つまり、Region、Company、Dept、およびSubDeptによるグループ化の合計数が1であり、AmountSependが0または正/負であるかどうかにかかわらず一致タイプが不一致でMatching_UIDがid値。例の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対900ではなく900対(-600と-300)? MatchIds列には2つの値しか追加しません。 – andrews

+0

上記のユーザーは必要な出力を参照してください。負の値の合計は必要ありません。正と負の値だけをチェックします。 – Mansoor

+0

"地域、会社、部署、副所属別の合計金額" - 私の意見では、合計は2の合計ではなく、同じ基準のすべてのレコードの合計を意味します。一般的な仕事。しかし、OPが明確になるようにしてください。 – andrews

関連する問題