Picknicker1
(Themenstarter)
Anmeldungsdatum: 7. Juni 2008
Beiträge: 83
|
So, hier bin ich wieder 😉
Hier mal ne Demo DB. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 | SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
CREATE TABLE IF NOT EXISTS buchungen_test (
id int(11) NOT NULL AUTO_INCREMENT,
datum date DEFAULT NULL,
iban varchar(50) NOT NULL,
vorzeichen char(1) NOT NULL,
betrag decimal(7,2) NOT NULL,
k_id smallint(6) NOT NULL,
kommission mediumint(6) unsigned zerofill NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY datum2 (iban,vorzeichen,betrag,k_id,kommission),
UNIQUE KEY id (id),
UNIQUE KEY datum (iban,vorzeichen,betrag,k_id,kommission,datum),
KEY k_id (k_id),
KEY kommission (kommission)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO buchungen_test (id, datum, iban, vorzeichen, betrag, k_id, kommission) VALUES
(500, '2016-01-12', 'DE06xxxxxxxxxxxxxxxx06', '-', 331.29, 24, 000602),
(850, '2016-05-04', 'DE06xxxxxxxxxxxxxxxx06', '-', 1037.43, 24, 000609),
(95, '2016-02-23', 'DE11555555555555555504', '-', 492.54, 24, 000602),
(194, '2016-03-16', 'DE11555555555555555504', '-', 650.34, 24, 000607),
(193, '2016-03-16', 'DE16xxxxxxxxxxxxxxxx80', '-', 352.00, 24, 000607),
(279, '2016-04-13', 'DE17xxxxxxxxxxxxxxxx08', '+', 10.00, 24, 000608),
(103, '2016-02-24', 'DE17xxxxxxxxxxxxxxxx08', '+', 70.00, 24, 000609),
(280, '2016-04-13', 'DE17xxxxxxxxxxxxxxxx08', '+', 200.24, 24, 000607),
(137, '2016-03-01', 'DE17xxxxxxxxxxxxxxxx08', '+', 708.54, 24, 000609),
(265, '2016-04-04', 'DE17xxxxxxxxxxxxxxxx08', '+', 1037.43, 24, 000609),
(220, '2016-03-23', 'DE17xxxxxxxxxxxxxxxx08', '+', 2630.11, 24, 000605),
(30, '2016-02-08', 'DE17xxxxxxxxxxxxxxxx08', '+', 3009.82, 24, 000607),
(113, '2016-02-25', 'DE17xxxxxxxxxxxxxxxx08', '+', 3693.26, 24, 000607),
(479, '2016-01-08', 'DE17xxxxxxxxxxxxxxxx08', '+', 4940.96, 24, 000602),
(543, '2016-01-27', 'DE17xxxxxxxxxxxxxxxx08', '+', 5758.96, 24, 000609),
(1018, '2016-05-25', 'DE67xxxxxxxxxxxxxxxx54', '-', 10.00, 24, 000608),
(192, '2016-03-16', 'DE70xxxxxxxxxxxxxxxx48', '-', 9.82, 24, 000607),
(727, '2016-04-21', 'DE70xxxxxxxxxxxxxxxx48', '-', 71.40, 24, 000607),
(501, '2016-01-12', 'DE70xxxxxxxxxxxxxxxx48', '-', 650.93, 24, 000602),
(37, '2016-02-09', 'DE70xxxxxxxxxxxxxxxx48', '-', 752.32, 24, 000607),
(7, '2016-02-01', 'DE70xxxxxxxxxxxxxxxx48', '-', 892.50, 24, 000609),
(36, '2016-02-09', 'DE74xxxxxxxxxxxxxxxx82', '-', 12.00, 24, 000607),
(851, '2016-05-04', 'DE88xxxxxxxxxxxxxxxx51', '-', 25.00, 24, 000609),
(728, '2016-04-21', 'DE94xxxxxxxxxxxxxxxx33', '-', 128.30, 24, 000607),
(144, '2016-03-03', 'DE94xxxxxxxxxxxxxxxx33', '-', 778.54, 24, 000609),
(499, '2016-01-12', 'DE94xxxxxxxxxxxxxxxx33', '-', 3436.20, 24, 000602),
(9, '2016-02-01', 'DE94xxxxxxxxxxxxxxxx33', '-', 4841.46, 24, 000609),
(146, '2016-03-03', 'DE94xxxxxxxxxxxxxxxx33', '-', 4927.14, 24, 000607);
COMMIT;
|
Die besagte Iban wäre in der Testumgebung DE11555555555555555504, als Ergebnis dürfte 602 und 607 NICHT als Ergebnis erscheinen, es wird aber 602 608 609 selektiert, somit ist die 602 falsch. Selektiert habe ich mit:
| SELECT CONCAT(k_id, kommission) as k_nr, count(iban), iban
FROM `buchungen_test`
WHERE vorzeichen = "-"
GROUP BY `k_nr`
HAVING NOT iban = "DE11555555555555555504"
ORDER BY k_nr DESC
|
|
Hoerbert
Anmeldungsdatum: 3. Oktober 2007
Beiträge: 375
|
Hallo Picknicker1, OK, wenn ich das jetzt richtig verstehe, dann hast du tatsächlich einen Denkfehler hier drin. Verstehe ich das richtig, dass du beim "Ausschluss der genannten IBAN" den Ausschluss der kompletten Kommission meinst, in der diese IBAN auch nur einmalig auftaucht? Wenn ja, dann reicht es nicht, die IBAN einfach per WHERE oder HAVING auszuschließen (wobei HAVING hier vermutlich auch noch das falsche Werkzeug ist). Wenn du eine WHERE-Klausel benutzt, dann werden nämlich einfach nur bei der Zählung die Zeilen ausgelassen, in denen die IBAN vorkommt. Alle anderen Zeilen dieser Kommission werden trotzdem gezählt. Der einfachste Weg wäre vermutlich, die entsprechenden Kommissionen dann per Sub-Select auszuschließen. Das würde dann in etwa so aussehen: | SELECT CONCAT(k_id, kommission) as k_nr, count(iban), iban
FROM `buchungen_test`
WHERE vorzeichen = "-"
AND kommission NOT IN (SELECT kommission FROM buchungen_test WHERE IBAN = "DE11555555555555555504")
GROUP BY `k_nr`
ORDER BY k_nr DESC
|
Damit wirst du dann die entsprechenden Kommissionen komplett los. Ich weiß jetzt nicht, wie das Performance-technisch ist und ob es vielleicht einen eleganteren Weg gibt, allerdings ist das so vermutlich am einfachsten zu verstehen. Und noch eine Anmerkung: Ich bin mir nicht ganz sicher, welchen Zweck die Ausgabe der Spalte "iban" in dieser Abfrage hat. Denn theoretisch gibt es ja mehrere IBANs, die die Datenbank an dieser Stelle ausgeben könnte, weil es ja so ist, dass pro Kunde und Kommission mehrere IBANs benutzt werden. Insofern ist die Ausgabe der Spalte "iban" an dieser stelle nicht sinnvoll, weil MySQL sich da quasi eine einzelne IBAN aussuchen kann, die er da ausgibt. Ich hoffe ich habe dich richtig verstanden und mich im Gegenzug auch einigermaßen verständlich ausgedrückt 😉 Gruß Torben
|