2016-12-02 4 views
1

ich Daten wie folgt:SQL Server SQL-Anweisung - Aktualisieren Datensatz

enter image description here

Ich brauche zu aktualisieren Matching_id und Matching_Type von column id, region, company, dept, subdept and amountsepend verwenden. Die Logik lautet:

Sum AmountSepend by Region, Company, Dept and SubDept. Wenn der Summenbetrag 0 ist, dann ist Matching_Type "Match" und Matching_id ist die Kombination der ID für den übereinstimmenden Datensatz, ansonsten "Not Match" und Matching_id ist die ID. ** SUMME bedeutet die Gesamtsumme aller Datensätze für dieselben Kriterien, unabhängig davon, ob der Betrag positiv oder negativ ist. Ein weiteres wichtiges Kriterium ist, ob die Transaktion ein einzelner Datensatz ist, was bedeutet, dass die Gesamtzahl durch Gruppieren nach Region, Firma, Abteilung und Unterabteilung 1 ist. Dann stimmt der Übereinstimmungstyp nicht überein und Matching_UID ist ID, unabhängig davon, ob AmountSend 0 oder positiv/negativ ist Wert. Beispiel id 8.

Im Folgenden finden Sie die Ausgabe:

enter image description here

Hier ist die Tabelle und Datenskript

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] 

Wie konnte ich ein solches Ergebnis erreicht? Irgendwelche Hilfe/Hinweis würde schätzen

+0

sind Sie noch auf der Suche nach einer Lösung für diese? – andrews

Antwort

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

Sind Sie sicher, dass Ihr Code korrekt funktioniert, wenn die negative Summe für dieselbe Abteilung in 2 oder mehr Datensätze aufgeteilt wird, z. nicht 900 vs-900 aber 900 vs (-600 und -300)? Sie fügen nur 2 Werte in die MatchIds-Spalte ein. – andrews

+0

Siehe oben angegebene Benutzerausgabe. Sie benötigen keine Summe negativer Werte. Sie überprüfen nur den positiven und den gleichen negativen Wert. – Mansoor

+0

"Betragssumme nach Region, Firma, Abteilung und Unterabteilung" - meiner Meinung nach bedeutet Summe die Summe aller Datensätze für gleiche Kriterien und nicht die Summe von nur 2. Nur 1 positive und 1 negative Datensätze sind nur ein vereinfachter Fall von eine allgemeine Aufgabe. Lassen Sie das OP jedoch klarstellen. – andrews

Verwandte Themen