SQL Query (Sybase): Subtrahiere 1 aus der Summe einer Spalte abhängig vom Wert eines anderen

Ich habe 2 SQL-Abfragen, die ich in eine aufgrund der schiere Größe der database zu kombinieren (die meisten der Einzelhandelsgeschäfte, es ist in Ordnung, aber einige haben viel viel mehr transactions)

Grundsätzlich brauche ich die Anzahl der transactions pro Mitarbeiter für einen bestimmten Tag. Um dies zu tun, zähle ich die unterschiedliche Anzahl von Transaktionsnummern pro Mitarbeiter (jeder Artikel in einer Transaktion bekommt seine eigene Zeile mit der gleichen Transaktionsnummer, also muss es deutlich sein). Allerdings gibt es eine Spalte "txnvoidmod". Grundsätzlich ist das Ziel, dass, wenn der Wert dieser Spalte 0 ist, zähle ich einfach die transactions normal, aber wenn der Wert 1 ist, muss ich einen abziehen, weil die Transaktion tatsächlich abgelehnt wurde.

Hier sind einige Beispieldaten

+------ -+------------+-------------+ |transnum| txnvoidmod | salesprsnid | +--------+------------+-------------+ | 115568 | 0 | 1339 | | 115568 | 0 | 1339 | | 114566 | 0 | 1339 | | 114566 | 0 | 1339 | | 115504 | 0 | 2555 | | 105551 | 0 | 0452 | | 105551 | 0 | 0452 | | 105551 | 0 | 0452 | | 105552 | 1 | 0452 | | 105552 | 1 | 0452 | | 105552 | 1 | 0452 | +--------+------------+-------------+ 

Ich lasse einige Felder aus, die für dieses Beispiel unnötig sind.

Hier ist die Abfrage, die ich benutze

  select txn_pos_transactions.cashiernum as salesprsnid, (count(distinct MS.transnum))as transcnt from Txn_Merchandise_Sale MS INNER JOIN txn_pos_transactions ON MS.transnum=txn_pos_transactions.transnum Where MS.modtime like '2013-06-01 %' AND MS.itemdatetime like '2013-06-01 %' and (txnvoidmod=0 or txnvoidmod=1) Group by txn_pos_transactions.cashiernum order by salesprsnid 

Ich verlasse die Tatsache, dass diese Abfrage auch für Netsales und Einheiten verkauft wird, also muss ich das berücksichtigen. Einige Beispielergebnisse für diese Abfrage (einschließlich der weggelassenen Netsales und Einheiten Teil, der ziemlich ausführlich ist)

 +------ -+------------+-------------+-------------+ |transcnt| unitssold | salesprsnid | netsalesamt | +--------+------------+-------------+-------------+ | 2 | 5 | 1339 | 98.50 | | 1 | 2 | 2555 | 35.20 | | 2 | 1 | 0452 | 24.00 | +--------+------------+-------------+-------------+ 

Von oben hat der Mitarbeiter mit id "0452" 2 transactions in den Ergebnissen (transcnt), aber ich brauche meine Abfrage zu build, so dass es tatsächlich als 0 transactions liest, weil ihre 1 Transaktion hat ein txnvoidmod gleich 1 und ist eigentlich ein void der vorherigen Transaktion mit txnvoidmod = 0. Wenn ich nur "txnvoidmod = 0" in der where-Klausel sagte, dann hätte "0452" 1 Transaktion, aber ich muss noch die Transaktion abziehen, wo das txnvoidmod = 1 ist

Ich habe verschiedene Dinge wie Bedingungen ausprobiert und den Wert des txnvoidmod abgezogen, aber ohne Erfolg, wie es versucht, durch das txnvoidmod zu gruppieren, das mir unnötige Zeilen gibt. Ich brauche dort nur eine Zeile pro salesprsnid.

Irgendwelche Vorschläge wäre toll, danke.

Übrigens verwende ich eine SAP-Sybase-database .. Es scheint wie zum größten Teil, dass die Abfragen gleich sind, mit exception einiger Artikel, die sie fehlen.

Wie wäre es damit:

 SELECT txn_pos_transactions.cashiernum AS salesprsnid ,COUNT(DISTINCT CASE txnvoidmod WHEN 1 THEN MS.transnum END) AS transcnt FROM Txn_Merchandise_Sale MS INNER JOIN txn_pos_transactions ON MS.transnum = txn_pos_transactions.transnum WHERE MS.modtime LIKE '2013-06-01 %' AND MS.itemdatetime LIKE '2013-06-01 %' AND txnvoidmod IN(0, 1) GROUP BY txn_pos_transactions.cashiernum ORDER BY salesprsnid 

Eine Idee von Dave Sextons Kommentar zu bekommen, habe ich meine Abfrage wie folgt geändert:

  set ansinull off select txn_pos_transactions.cashiernum as salesprsnid, (count((DISTINCT CASE txnvoidmod WHEN 0 THEN MS.transnum END)) - (count((DISTINCT CASE txnvoidmod WHEN 1 THEN MS.transnum END)) as transcnt, from Txn_Merchandise_Sale MS INNER JOIN txn_pos_transactions ON MS.transnum=txn_pos_transactions.transnum Where MS.modtime like '2013-06-01 %' AND MS.itemdatetime like '2013-06-01 %' and (txnvoidmod=0 or txnvoidmod=1) Group by txn_pos_transactions.cashiernum order by salesprsnid 

Ich musste "set ansinull off" einschließen, weil ich null aggregate Fehler bekam. Nicht sicher, ob dies mich langsam verlangsamt oder nicht, aber das scheint zu funktionieren.

Vielen Dank