MySQL Count mit Where
Hallo zusammen,
ich habe eine Tabelle die so aussieht:
ID - Kennz
1 -
2 -
2 - X
2 - X
3 -
4 -
4 - X
Jetzt möchte ich eine Abfrage stricken, die mir eine eindeutige Liste der IDs liefert, mit einem Kennzeichen, ob der Datensatz doppelt in der Tabelle steht.
Für die Auflistung sollen alle Datensätze beachtet werden, bei dem Kennzeichen nur jene, welche in der Spalte Kennz = X sind.
Folgender Ansatz ist getroffen:
Die Auflistung klappt, das Kennzeichen "Doppelt" auch - jedoch beachtet er nicht die Spalte "Kennz". Baue ich diese in das HAVING ein, wird sie beachtet - logischerweise klappt dann aber die vollständige Auflistung nicht mehr.
Hat jemand einen Tipp für mich??
Achja, das Ergebnis für mein Beispiel sollte so aussehen:
1 -
2 - X
3 -
4 -
ich habe eine Tabelle die so aussieht:
ID - Kennz
1 -
2 -
2 - X
2 - X
3 -
4 -
4 - X
Jetzt möchte ich eine Abfrage stricken, die mir eine eindeutige Liste der IDs liefert, mit einem Kennzeichen, ob der Datensatz doppelt in der Tabelle steht.
Für die Auflistung sollen alle Datensätze beachtet werden, bei dem Kennzeichen nur jene, welche in der Spalte Kennz = X sind.
Folgender Ansatz ist getroffen:
SELECT a.ID, if(count(b.ID)>1,'X','')
FROM `Tabelle` a left JOIN Tabelle b on (a.ID=b.ID)
WHERE b.`Kennz`='X' group by a.`ID`
Die Auflistung klappt, das Kennzeichen "Doppelt" auch - jedoch beachtet er nicht die Spalte "Kennz". Baue ich diese in das HAVING ein, wird sie beachtet - logischerweise klappt dann aber die vollständige Auflistung nicht mehr.
Hat jemand einen Tipp für mich??
Achja, das Ergebnis für mein Beispiel sollte so aussehen:
1 -
2 - X
3 -
4 -
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 201270
Url: https://administrator.de/forum/mysql-count-mit-where-201270.html
Ausgedruckt am: 22.12.2024 um 17:12 Uhr
10 Kommentare
Neuester Kommentar
@Maik87
... ich vermute zwar, dass wieder keine Rückmeldungen Deinerseits kommen ...
Aber man will ja helfen.
G Jörg
... ich vermute zwar, dass wieder keine Rückmeldungen Deinerseits kommen ...
Aber man will ja helfen.
SELECT DISTINCT a.ID, IF(c.Anz > 1, 'X', '')
FROM tabelle a
LEFT JOIN (SELECT b.ID, COUNT(b.ID) AS Anz
FROM tabelle b
WHERE b.Kennz = 'X'
GROUP BY b.ID) c USING (ID)
G Jörg
Hallo Maik87,
a.ID und a.Kennzeichen gleich oder
a.ID gleich
Du hast in deiner Tabelle drei Datensätze mit der ID 2 und zwei Datensätze mit der ID 2 und dem Kennzeichen X.
select count(*),a.ID from tabelle a
group by a.ID having count(*)>1
select count(*),a.ID,a.Kennz from tabelle a
group by a.ID,a.Kennz having count(*)>1
grüße vom it-frosch
Hat jemand einen Tipp für mich??
ist nicht ganz einfach da die Tabelle gegen mindestens ein der Regeln (http://de.wikipedia.org/wiki/Normalisierung_%28Datenbank%29) verstößt. die mir eine eindeutige Liste der IDs liefert, mit einem Kennzeichen, ob der Datensatz doppelt in der Tabelle
Du müsstest mal definieren was ein doppelter Datensatz für dich ista.ID und a.Kennzeichen gleich oder
a.ID gleich
Du hast in deiner Tabelle drei Datensätze mit der ID 2 und zwei Datensätze mit der ID 2 und dem Kennzeichen X.
select count(*),a.ID from tabelle a
group by a.ID having count(*)>1
select count(*),a.ID,a.Kennz from tabelle a
group by a.ID,a.Kennz having count(*)>1
grüße vom it-frosch
Moin Maik87,
Macht dasselbe, nur flotter.
Grüße
Biber
P.S. Wenn deine von SAP gelieferten Daten wirklich so widersprüchlich und nicht-normalisiert kommen, dann musst du denen die falsche Anfrage für den Datenexport gegeben haben.
Hast du vielleicht gefordert "Ich möchte alle Datensätze haben, die bei euch im System sind!"?
Dann sind vielleicht auch die nicht aktiven/(logisch) gelöschten mit dabei. Anders ist für mich dieser hanebüchene Datenschiefstand nicht erklärlich (ich halte SAP zwar für dreiste Geldschneider, aber ich halte die nicht für strunzdoof).
P.P.S
habe grad gemerkt, dass ich gar nicht auf deinen frischesten kommentar geantwortet habe.
Im Neuesten kommentar schriebst du auf Nachfrage:
Dann mag Lianenschwingers und auch meine obige Abfrage manchmal das richtige Resultset liefert, aber nur durch Zufall.
Richtiger wäre
Aber dach spiegelt auch nicht den fachlichen Zusammenhang wieder, denn abgebildet werden muss ja der JOIN/die Gleichheit von zwei Feldern. Also:
Was daran Zweit frisst ist das (vermutlich leider nötige) DISTINCT - wenn in der TabelleParent IDs mehrfach vorkommen können, dann können logischerweise auch Kombinationen von ID und Kennzeichen mehrfach auftreten.
Zitat von @Maik87:
Funktionier super. Vielen Dank!
Muss ich nur noch ein wenig an der Performance arbeiten. Ziemlich lahm die Abfrage ;)
Wenn du als Ergebnis nur das brauchst, was du mit dem geposteten Statement jetzt bekommst, dann brauchst du auch nicht so umständlich abfragen:Funktionier super. Vielen Dank!
Muss ich nur noch ein wenig an der Performance arbeiten. Ziemlich lahm die Abfrage ;)
SELECT ID, 'X' as mehrAls1Datensatz
FROM tabelle
WHERE Kennz = 'X'
GROUP BY ID
Having count(ID) > 1
Macht dasselbe, nur flotter.
Grüße
Biber
P.S. Wenn deine von SAP gelieferten Daten wirklich so widersprüchlich und nicht-normalisiert kommen, dann musst du denen die falsche Anfrage für den Datenexport gegeben haben.
Hast du vielleicht gefordert "Ich möchte alle Datensätze haben, die bei euch im System sind!"?
Dann sind vielleicht auch die nicht aktiven/(logisch) gelöschten mit dabei. Anders ist für mich dieser hanebüchene Datenschiefstand nicht erklärlich (ich halte SAP zwar für dreiste Geldschneider, aber ich halte die nicht für strunzdoof).
P.P.S
habe grad gemerkt, dass ich gar nicht auf deinen frischesten kommentar geantwortet habe.
Im Neuesten kommentar schriebst du auf Nachfrage:
(JOIN-Bedingung ist) a.ID und a.Kennzeichen gleich WENN a.Kennzeichen = 'X'
Dann mag Lianenschwingers und auch meine obige Abfrage manchmal das richtige Resultset liefert, aber nur durch Zufall.
Richtiger wäre
Select b.ID, b.MehrAls1Child
From tabelleParent a,
(SELECT ID, 'X' as mehrAls1Child
FROM tabelleChild
WHERE Kennz = 'X'
GROUP BY ID
Having count(ID) > 1) b
Where a.id=b.Id and a.Kennzeichen ='X'
Aber dach spiegelt auch nicht den fachlichen Zusammenhang wieder, denn abgebildet werden muss ja der JOIN/die Gleichheit von zwei Feldern. Also:
Select distinct b.ID, b.MehrAls1Child
From tabelleParent a,
(SELECT ID, kennz, 'X' as mehrAls1Child
FROM tabelleChild
WHERE Kennz = 'X'
GROUP BY ID , kennz
Having count(ID) > 1) b
Where a.id=b.Id and a.Kennzeichen =b.kennz
Was daran Zweit frisst ist das (vermutlich leider nötige) DISTINCT - wenn in der TabelleParent IDs mehrfach vorkommen können, dann können logischerweise auch Kombinationen von ID und Kennzeichen mehrfach auftreten.
Hallo Biber, hallo Maik87,
ich hatte das so verstanden, dass erstmal alle ID's einmalig im Resultat (daher DISTINCT) auftauchen und zusätzlich ein 'X' in der Spalte Kennz. wenn die Kombination ID und 'X' mehr als einmal in der Ausgangstabelle vorkommt.
Maik87 korrigiere mich wenn ich falsch liege. Ich hoffe aber, dass mein Ergebniss nicht nur "manchmal" richtig ist.
G Jörg
ich hatte das so verstanden, dass erstmal alle ID's einmalig im Resultat (daher DISTINCT) auftauchen und zusätzlich ein 'X' in der Spalte Kennz. wenn die Kombination ID und 'X' mehr als einmal in der Ausgangstabelle vorkommt.
Maik87 korrigiere mich wenn ich falsch liege. Ich hoffe aber, dass mein Ergebniss nicht nur "manchmal" richtig ist.
G Jörg
Hallo Maik87,
anhand Deiner Beschreibung der Abfrage wird das ganze viel verständlicher. Vielleicht beim nächsten mal direkt so die Frage formulieren.
Bin mir jetzt nicht sicher, aber folgendes müsste auch funktionieren (und schneller sein)
G Jörg
anhand Deiner Beschreibung der Abfrage wird das ganze viel verständlicher. Vielleicht beim nächsten mal direkt so die Frage formulieren.
Bin mir jetzt nicht sicher, aber folgendes müsste auch funktionieren (und schneller sein)
SELECT a.id, IF(SUM(IF(a.kennz = 'X', 1, 0)) > 1, 'X', '') AS Anz
FROM tabelle AS a
GROUP BY a.id
G Jörg