joni2000de
Goto Top

MSSQL Anzahl unterschiedlicher Datensätze zurückgeben

Hi Admins,

ich brauche mal wieder etwas Nachhilfe. Ich habe eine Tabelle die so aussieht:
Nr  Name  Gruppe  Konto
1   Maier  K1  123456
2   Maier  K1  123456
3   Huber  K2  456789
4   Huber  K2  987654

Jetzt hätte ich gerne, dass zB in einer Spalte [Fehler] die Datensätze gekennzeichnet werden bei denen zwar die Gruppe identisch ist die aber unterschiedliche Konten hinterlegt haben (hier 3+4). Die Datensätze 1+2 können nicht zusammengefasst werden da sich diese in anderen Felder noch unterscheiden (zB Nr). Die Formel in Excel ist kein Problem, aber auf Grund der Datenmenge viel zu langsam. Geht das direkt in SQL?

Danke für eure Hilfe.
Gruß Joni

Content-ID: 178314

Url: https://administrator.de/forum/mssql-anzahl-unterschiedlicher-datensaetze-zurueckgeben-178314.html

Ausgedruckt am: 23.12.2024 um 11:12 Uhr

Pjordorf
Pjordorf 03.01.2012 um 13:15:47 Uhr
Goto Top
Hallo,

Zitat von @joni2000de:
Die Datensätze 1+2 können nicht zusammengefasst werden da sich diese in anderen Felder noch unterscheiden (zB Nr).
Aber genau dies trifft doch für deine Datensätze 3+4 auch zu?!?

Gruß,
Peter
joni2000de
joni2000de 03.01.2012 um 14:28:58 Uhr
Goto Top
Hallo Peter,

ja das trift auch auf 3+4 zu, aber diese liefern unterschiedliche Ergebnisse in [Anzahl Gruppe] nämlich eine Gruppe und [Anzahl Konten pro Gruppe] nämlich zwei Konten. Ich möchte alle Datensätze kennzeichnen bei denen die [Anzahl Gruppe] und [Anzahl Konten pro Gruppe] unterschiedlich sind. Bei DS1+2 ist [Anzahl Gruppe] 1 und [Anzahl Konten/Gruppe] auch 1 und somit kein Fehler.

Gruß Joni
nxclass
nxclass 03.01.2012 um 15:27:06 Uhr
Goto Top
SELECT x.markierung, t.*
FROM tabelle t LEFT JOIN (
    SELECT Name, Gruppe, 'MARK' AS 'markierung', COUNT(Konto) AS 'anzahl'  
    FROM tabelle
    GROUP BY Name, Gruppe
    HAVING 4 > 1
) x USING ( Name, Gruppe )
... MSSQL ist nicht so mein Ding, aber evtl. hilft Dir das
joni2000de
joni2000de 09.01.2012 um 00:07:51 Uhr
Goto Top
Hi nxclass,

ich wollte mich mal melden. Ich bin leider noch nicht zum testen gekommen. Feedback folgt noch.

Vorerst einmal danke.

Gruß Joni
nxclass
nxclass 09.01.2012 um 08:45:34 Uhr
Goto Top
Sollte diese verschachtelten SELECT Anweisungen unter MSSQL nicht unterstützt werden (!?) , dann kannst Du aus der inneren SELECT Anweisung ein View (Sicht) erstellen und dann über diese einen LEFT JOIN machen.
joni2000de
joni2000de 10.01.2012 um 01:20:23 Uhr
Goto Top
Hi nxclass,

mit deinem Code bin ich nicht ans Ziel gekommen, aber folgender hat funktioniert.

SELECT x.ANZ, t.name, t.gruppe, COUNT(t.gruppe) as ANZGP

FROM tabelle t
	LEFT JOIN (
		SELECT Name, Gruppe, Konto, COUNT(Konto) as ANZ
		FROM tabelle
		GROUP BY Name, Gruppe, Konto
		) x on x.konto=t.konto
group by x.ANZ, t.name, t.gruppe

Using wurde nicht akzeptiert. Ich bin mit SQL noch nicht so durch. Kannst du mir sagen was das Having 4>1 bewirken hätte sollen, das trifft ja immer zu? Und Using steht für das on ..=.. beim Join? Funktioniert das wenn die Spalten in beiden Tabellen gleich heißen?
Danke für deine Nachhilfe.

Gruß Joni
Biber
Biber 10.01.2012 um 07:05:00 Uhr
Goto Top
Moin joni200de,

das "Having 4>1" hätte geplanterweise interpretiert werden sollen als "Having {Spalte 4} > 1" oder, lesbar ausformuliert, "Having Count(Konto) >1".
Diese Bedingung fehlt übrigens in deinem Statement und es kann -auch wenn es jetzt ohne Syntaxfehler durchläuft- nicht das gewünschte Ergebnis liefern.
Ein "Having Count(Konto) > 1" muss also noch rein in den inneren SELECT und aus dem "LEFT JOIN" ein "JOIN" werden. Jedenfalls IMHO.

Die USING-Klausel kann, wie von dir vermutet, aus Bequemlichkeitsgründen dann benutzt werden, wenn die Spaltennamen in beiden Tabellen gleih sind.
Und dieser Fall ist hier natürlich immer gegeben, da es sich ja bei "den beiden gejointen Tabellen" tatsächlich um physkalisch ein und dieselbe handelt.

Was bei deinem "Count(t.gruppe) as ANZGP" nun herauskommt bzw herauskommen soll, das kann ich überhaupt nicht nachvollziehen.
Steht da etwas sinnvolles im resultset?

Grüße
Biber
joni2000de
joni2000de 11.01.2012 um 01:40:22 Uhr
Goto Top
Hi,

so müsste es aber jetzt funktionieren. Nochmal was will ich. Wenn in einer Gruppe unterschiedliche Konten hinterlegt sind soll eine Fehlermeldung ausgegeben werden. Da sich das in unterschiedlichen Objekten wiederholen kann habe ich das Objekt auch noch als Kriterium hinterlegt.

Tabelle
NR	Name	Gruppe	Konto	Objekt
1	Maier	K1	123456	1
2	Maier	K1	123456	1
3	Huber	K2	234567	1
4	Huber	K2	345678	1
5	Müller	K3	98765	2
6	Müller	K3	98765	2
7	Maier	K5	123456	2
8	Maier	K4	123456	2

Abfrage
select distinct t.*, KTO.ANZKTO, GP.ANZGP, case when KTO.ANZKTO<>GP.ANZGP then 'Fehler' else '' end as Achtung  
from [Test].[dbo].[ZZ_Test] t
  join (select k.obj, k.Konto, COUNT(konto) as ANZKTO from [Test].[dbo].[ZZ_Test] k
    group by k.OBJ, k.gruppe, k.Konto) KTO on kto.konto=t.konto and KTO.obj=t.OBJ
  join (select g.obj, g.gruppe, COUNT(gruppe) as ANZGP from [Test].[dbo].[ZZ_Test] g
   group by g.OBJ, g.gruppe) GP on GP.gruppe=t.gruppe and gp.obj=t.OBJ
order by t.obj

Ergebnis
NR	Name	Gruppe	Konto	OBJ	ANZKTO	ANZGP	Achtung
1	Maier	K1	123456	1	2	2	
2	Maier	K1	123456	1	2	2	
3	Huber	K2	234567	1	1	2	Fehler
4	Huber	K2	345678	1	1	2	Fehler
5	Müller	K3	98765	2	2	2	
6	Müller	K3	98765	2	2	2	
7	Maier	K5	123456	2	1	1	
8	Maier	K4	123456	2	1	1	

Feedback erwünscht, danke.

Gruß Joni
Biber
Biber 11.01.2012 um 17:34:41 Uhr
Goto Top
Moin Joni2000de,

ein wenig verwirrst du mich schon, offen gestanden.

Wie hängen denn nun "Konto" und "Gruppe" zusammen - du kannst es doch nicht jeden Tag umdefinieren.

Ganz oben in deinem ersten Kommentar hast du geschrieben:
Ich möchte alle Datensätze kennzeichnen bei denen die [Anzahl Gruppe] und [Anzahl Konten pro Gruppe] unterschiedlich sind.

In deiner Abfrage und im geposteten Ergebnis ist es aber nur ein Fehler, wenn eine Gruppe auf mehrere Konten verweist.
Der umgekehrte Fall, also in Satz 1, 2, 7 und 8 zeigen mehrere Gruppen auf ein Konto - das scheint ja okay zu sein.

Wenn denn aber jede Gruppe (zum Beispiel K1) auf im Beispiel oben immer auf Konto 123456 zeigen muss, dann ist es doch "Konto" nur ein abhängiges Attribut einer Gruppe.
Und müsste entsprechend in einer Tabelle "Gruppe" z.B. mit den Feldern "Gruppe, "Gruppenname", "Konto" gepflegt werden

Oder wie ist der Zusammenhang?

Grüße
Biber
joni2000de
joni2000de 11.01.2012 um 22:32:30 Uhr
Goto Top
Hallo Biber,
das Ganze ist wesentlich komplizierter. Die obige Tabelle ist das Ergebnis der Abfrage. Da in dem Ganzen viele Variablen sind, die evtl. Fehler verursachen möchte ich mit der Abfrage kontrollieren ob in einem Objekt pro Gruppe immer nur ein Konto zugeordnet ist. Die erste Aussage sollte bedeuten, dass wenn in einem Objekt eine Gruppe zB 2 x vorkommt, dann muss die Kombination Gruppe/Konto auch 2 x vorkommen und ist somit einheitlich. Es kann aber sein, dass das gleiche Konto bei mehreren Gruppen hinterlegt ist. Das passt so, wenn es dann wieder in der jeweiligen Gruppe das einzige Konto ist (darum kann ich nicht das Konto alleine Zählen).
Ich weiß es ist nicht so einfach darzustellen, genau darum sollte diese Kontrolle eingebaut werden.
Gruß Joni
Biber
Biber 11.01.2012 um 23:46:21 Uhr
Goto Top
Moin joni2000de,

wäre es dann nicht einfacher, im ersten Schritt einfach ein

SELECT gruppe, konto, count(konto) as Anzahl FROM (
   SELECT distinct gruppe, konto
   from [Test].[dbo].[ZZ_Test] 
) Group by gruppe, konto
HAVING count (konto) > 1 
...zu machen?
Sollte da mehr als leeres Resultset herauskommen, dann muss du doch ohnehin alle relevanten Sätze der gefundenen Gruppe(n) auf den Schirm holen - um intuitiv die "falschen" zu berichtigen.

Wieo kann denn denn diese "falsche" Zuordnung nicht bei der Erfassung/Eingabe der Daten abgefangen werden?
"Gruppe" und "Konto" sind doch nicht unabhängig voneinander - das ist doch offensichtlch VORHER bekannt und nicht HINTERHER zu berichtigen.

Grüße
Biber
joni2000de
joni2000de 12.01.2012 um 00:05:01 Uhr
Goto Top
Hi Biber,

die Dateneingabe kann ich nicht beinflussen, da die Software nicht von uns ist. Das ganz "Ding" ist komplett neu und der Lieferant will da schon eine Sicherheit einbauen (bis wann die läuft???). Unsere Mitarbeiter haben verschiedene Listen die sie für Ihre Arbeit brauchen. Auf diesen Listen möchte ich die falschen Datensätze kennzeichnen. Es nutzt mir nichts wenn ich die Daten am Bildschirm habe da sie laufend bearbeitet werden und ich dann alle Fehler suchen muss. Mit deinem Select geht das auch, wenn es als Left Join an die Tabelle gehängt wird und dann jeweils neben dem Konto den Fehler anzeigt. Es sollte meiner Meinung nach beides ans Ziel führen. Auf jeden Fall danke für deine Hilfe und Aufklärung.

Gruß Joni