# SQL-Abfrage für nur einmal vorkommende Werte



## Hilflos05 (18. November 2012)

Hallo,

ich versuche mit einer SQL-Abfrage aus einer wie folgt aussehenden Datenbanktabelle


IDAutorKategorie1HansRoman2FrankRoman3HansComic4HansSport5FrankHeimat

heraus zu bekommen, in wieviel Kategorien die Autoren als einzige erfaßt sind. Das Ergebnis sollte also lauten:

Hans2Frank1


```
SELECT Autor, COUNT(Kategorie) FROM Tabelle WHERE COUNT(Kategorie)=1
```

bringt keinen Erfolg, was ich mittlerweile auch nachvollziehen kann. Irgendwie finde ich keinen Ansatz; ich habe schon an irgendwas mit UNIQUE gedacht, aber das ist scheinbar nur eine Spalteneigenschaft.


----------



## dyed (18. November 2012)

Bin mir nicht sicher ob du das meinst oder nicht, aber probiers mal aus:

```
select distinct * from TABELLE
```


----------



## Hilflos05 (18. November 2012)

Mit distinct habe ich es auch schon erfolglos versucht. Das prüft aber leider nicht die Anzahl der insgesamt in der Kategorie vorhandenen Autoren.


----------



## Yaslaw (18. November 2012)

mysql?
Zuerst die Kategorien auswählen welche nur einmal vorkommen. Dann, ein COUNT(DISTINCT  ) über die Kategorien


```
SELECT
	t.autor,
	COUNT(DISTINCT t.kategorie)
FROM
	table1 AS t
	-- Die Kategorien die nur einmal vorkommen
	INNER JOIN (
			SELECT kategorie
			FROM table1
			GROUP BY kategorie
			HAVING COUNT(*) = 1
		) AS kats
		ON t.kategorie = kats.kategorie 
GROUP BY
	t.autor
```


----------



## dyed (18. November 2012)

Ah ok. Verstehe jetzt was du suchst: 

```
select ID, AUTOR, count(KATEGORIE)  from TABELLE 
group by KATEGORIE having count(*)
```

Hoffe es stimmt so, habe es nur aus dem Kopf gemacht.
Überprüfe das mal und falls Fehler da sind, verbessere sie selbstständig


----------



## Yaslaw (18. November 2012)

```
having count(*)
```
Bringt gar nix. Was soll count(*) für einen Wert haben?


----------



## dyed (18. November 2012)

Verstehe nicht ganz was du meinst.

count(*) zählt alle Werte?


----------



## Yaslaw (18. November 2012)

Ja. Aber HAVING vergleicht Werte (Wertet True/False aus). Fast wie WHERE, ausser das HAVING nach dem Gruppieren ausgeführt wird und WHERE vor davor.
Also, mit was sollen die gezählten Werte deiner Meinung nach verglichen werden?

Eine Funktionierende Lösung steht weiter oben von mir getestet und gepostet.


----------



## dyed (18. November 2012)

Yaslaw hat gesagt.:


> Ja. Aber HAVING vergleicht Werte (Wertet True/False aus). Fast wie WHERE, ausser das HAVING nach dem Gruppieren ausgeführt wird und WHERE vor davor.
> Also, mit was sollen die gezählten Werte deiner Meinung nach verglichen werden?
> 
> Eine Funktionierende Lösung steht weiter oben von mir getestet und gepostet.



Achja ja stimmt. Du hast recht. 
Da müsste dahinter ">= 1"


----------



## Yaslaw (19. November 2012)

Das ganze SQL ist trotzdem ziemlich falsch. Es gibt 'HANS 2' zurück.
Du machst ein GROUP BY kategorie. Zugleich einen SELECT auf ID und Autor. Diese werden automatisch ebenfalls dem GROUP BY zugeordnet...

Teste doch dein SQL mal. Und dann testet du meins.....


----------



## Hilflos05 (19. November 2012)

@Yaslaw

Ich habe deinen SQL-String in meinem Programm (ASP.net mit Zugriff auf eine Access-Datei) mal ausprobiert. 

Der Abfragegenerator von VS meckerte jeoch bei dem DISTINCT. Ich habe es dann einfach mal weggelassen und es scheinen richtige Ergebnisse raus zu kommen; konnte jedoch noch nicht genauer prüfen.


----------



## Yaslaw (19. November 2012)

Also MS ACCESS kennt glaub das Subselect nicht.
Ob jetzt das SQL in Access oder in ASP verwurstelt wird weiss ich nicht, da ich genau NULL Erfahrung mit ASP habe.


----------

