2016-04-25 8 views
0

Wir haben eine Buchhaltungsdatenbank in SQL Server implementiert. Die tatsächlichen Buchhaltungsdatensätze sind in der records Tabelle mit dem folgenden Schema (Namen geändert, um die unschuldigen zu schützen + irrelevante Spalten entfernt).SQL Entsprechende negative und positive Datensätze finden

Einige schlechte Datensätze wurden hinzugefügt. Geschäftsregeln hinderten uns daran, die Datensätze einfach zu löschen, so dass sie für denselben Betrag mit negativen Datensätzen auf Null gesetzt werden mussten (d. H. Ein Datensatz von 4.521 $ wird mit einem Datensatz von -5.221 $ auf Null gesetzt).

Das Problem ist, dass einige der negativen Datensätze an eine falsche productId gebunden wurden.

Ich brauche eine Abfrage, die alle Datensätze mit entgegengesetzten Mengen, innerhalb der gleichen Kampagne zeigtYear, die an verschiedene productIds gebunden sind.

Die Ergebnismenge würde wie folgt aussehen:

recordId | amount | dateRecorded | campaignYear | storeId | productId 
11545  | 1132.13 | '2015-05-14' | 2015   | 45  | 1729 
90463  | -1132.13 | '2015-08-02' | 2015   | 45  | 2402 
25487  | 9300.00 | '2011-01-13' | 2010   | 122  | 85060 
67953  | -9300.00 | '2014-06-06' | 2010   | 122  | 11348 
01045  | 5045.99 | '2001-11-29' | 2001   | 3  | 105 
32468  | -5045.99 | '2016-08-01' | 2001   | 3  | 109 

Hinweis die gleiche storeId aber unterschiedliche productId für jedes Paar von positiven/negativen Aufzeichnungen.

Ich weiß nicht wirklich, wie man das macht.

Vielen Dank im Voraus!

Antwort

1

Verwendung exists.

select * from tablename t 
where exists (select 1 from tablename t1 
       where t.amount = -1*t1.amount 
       and t.productid <> t1.productid 
       and t.campaignyear = t1.campaignyear 
       and t.storeid = t1.storeid) 

Mit self-join.

select t.* 
from tablename t 
JOIN tablename t1 ON t.productid <> t1.productid 
and t.campaignyear = t1.campaignyear 
and t.storeid = t1.storeid 
WHERE t.amount = -t1.amount 
ORDER BY t.storeid, abs(t.amount) 
+1

Ich mag Antworten besser, die Dinge erklären, d. H. Wie Sie zu einer Abfrage gelangen. (In diesem Fall: Sie suchen nach Datensätzen, für die * existiert * ein Geschwister, also verwenden Sie 'EXISTS'). Aber die Antwort ist trotzdem korrekt :-) Ich würde 'ORDER BY ABS (Betrag), campaignyear, storeid 'hinzufügen, um die Geschwister nebeneinander zu bekommen. –