Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

MSSQL Anzahl unterschiedlicher Datensätze zurückgeben

Frage Entwicklung Datenbanken

Mitglied: joni2000de

joni2000de (Level 1) - Jetzt verbinden

03.01.2012 um 13:04 Uhr, 5669 Aufrufe, 12 Kommentare

Hi Admins,

ich brauche mal wieder etwas Nachhilfe. Ich habe eine Tabelle die so aussieht:
01.
Nr  Name  Gruppe  Konto 
02.
1   Maier  K1  123456 
03.
2   Maier  K1  123456 
04.
3   Huber  K2  456789 
05.
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
Mitglied: Pjordorf
03.01.2012 um 13:15 Uhr
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
Bitte warten ..
Mitglied: joni2000de
03.01.2012 um 14:28 Uhr
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
Bitte warten ..
Mitglied: nxclass
03.01.2012 um 15:27 Uhr
01.
SELECT x.markierung, t.* 
02.
FROM tabelle t LEFT JOIN ( 
03.
    SELECT Name, Gruppe, 'MARK' AS 'markierung', COUNT(Konto) AS 'anzahl' 
04.
    FROM tabelle 
05.
    GROUP BY Name, Gruppe 
06.
    HAVING 4 > 1 
07.
) x USING ( Name, Gruppe )
... MSSQL ist nicht so mein Ding, aber evtl. hilft Dir das
Bitte warten ..
Mitglied: joni2000de
09.01.2012 um 00:07 Uhr
Hi nxclass,

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

Vorerst einmal danke.

Gruß Joni
Bitte warten ..
Mitglied: nxclass
09.01.2012 um 08:45 Uhr
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.
Bitte warten ..
Mitglied: joni2000de
10.01.2012 um 01:20 Uhr
Hi nxclass,

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

01.
SELECT x.ANZ, t.name, t.gruppe, COUNT(t.gruppe) as ANZGP 
02.
 
03.
FROM tabelle t 
04.
	LEFT JOIN ( 
05.
		SELECT Name, Gruppe, Konto, COUNT(Konto) as ANZ 
06.
		FROM tabelle 
07.
		GROUP BY Name, Gruppe, Konto 
08.
		) x on x.konto=t.konto 
09.
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
Bitte warten ..
Mitglied: Biber
10.01.2012 um 07:05 Uhr
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
Bitte warten ..
Mitglied: joni2000de
11.01.2012 um 01:40 Uhr
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.

01.
Tabelle 
02.
NR	Name	Gruppe	Konto	Objekt 
03.
1	Maier	K1	123456	1 
04.
2	Maier	K1	123456	1 
05.
3	Huber	K2	234567	1 
06.
4	Huber	K2	345678	1 
07.
5	Müller	K3	98765	2 
08.
6	Müller	K3	98765	2 
09.
7	Maier	K5	123456	2 
10.
8	Maier	K4	123456	2 
11.
 
12.
Abfrage 
13.
select distinct t.*, KTO.ANZKTO, GP.ANZGP, case when KTO.ANZKTO<>GP.ANZGP then 'Fehler' else '' end as Achtung 
14.
from [Test].[dbo].[ZZ_Test] t 
15.
  join (select k.obj, k.Konto, COUNT(konto) as ANZKTO from [Test].[dbo].[ZZ_Test] k 
16.
    group by k.OBJ, k.gruppe, k.Konto) KTO on kto.konto=t.konto and KTO.obj=t.OBJ 
17.
  join (select g.obj, g.gruppe, COUNT(gruppe) as ANZGP from [Test].[dbo].[ZZ_Test] g 
18.
   group by g.OBJ, g.gruppe) GP on GP.gruppe=t.gruppe and gp.obj=t.OBJ 
19.
order by t.obj 
20.
 
21.
Ergebnis 
22.
NR	Name	Gruppe	Konto	OBJ	ANZKTO	ANZGP	Achtung 
23.
1	Maier	K1	123456	1	2	2	 
24.
2	Maier	K1	123456	1	2	2	 
25.
3	Huber	K2	234567	1	1	2	Fehler 
26.
4	Huber	K2	345678	1	1	2	Fehler 
27.
5	Müller	K3	98765	2	2	2	 
28.
6	Müller	K3	98765	2	2	2	 
29.
7	Maier	K5	123456	2	1	1	 
30.
8	Maier	K4	123456	2	1	1	
Feedback erwünscht, danke.

Gruß Joni
Bitte warten ..
Mitglied: Biber
11.01.2012 um 17:34 Uhr
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
Bitte warten ..
Mitglied: joni2000de
11.01.2012 um 22:32 Uhr
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
Bitte warten ..
Mitglied: Biber
11.01.2012 um 23:46 Uhr
Moin joni2000de,

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

01.
SELECT gruppe, konto, count(konto) as Anzahl FROM ( 
02.
   SELECT distinct gruppe, konto 
03.
   from [Test].[dbo].[ZZ_Test]  
04.
) Group by gruppe, konto 
05.
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
Bitte warten ..
Mitglied: joni2000de
12.01.2012 um 00:05 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
C und C++
gelöst Anzahl der Buchstaben in einem String Element Array C++ (3)

Frage von Protected zum Thema C und C ...

Zusammenarbeit
Minimale Anzahl Admins? (6)

Frage von 1410640014 zum Thema Zusammenarbeit ...

Batch & Shell
gelöst 1 PDF entsprechend der Anzahl duplizieren (5)

Frage von Kalisser zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...