Count van een record met 0 weergeven

Status
Niet open voor verdere reacties.

VreXz

Gebruiker
Lid geworden
14 feb 2011
Berichten
9
Ey goeie dag mensen,

Was bezig met het schrijven van een query om vervolgens te gaan toe te passen in een keuzelijst, voor in mijn formulier. Ik maak daar gebruik van rijbron om de query straks in te zetten.

Het volgende wil ik graag voor elkaar krijgen: Er zijn twee tabellen die met elkaar in contact staan. In de dbo_Gebruiker staan mijn gebruikers die een geheime vraag nummer hebben gekozen. Deze verwijst naar dbo_Vraag. dbo_Vraag bevat twee dingen, namelijk vraagnummer (die gelinkt staat aan dbo_Gebruiker.vraagnummer) en tekstvraag.

Nu wil ik hier graag een count bij hebben zodat ik kan zien hoevaak de vraag is gebruikt. Dat er eigenlijk een nieuwe kolom bij komt met Aantal. Het probleem is dat ik de het volgende heb; 3 geheime vragen, maar er worden er twee van de drie gebruikt. Nu wil ik graag dat die 3de die niet wordt gebruikt, toch wordt geteld en dat er dan een 0 uitkomt, ipv dat ik de regel niet eens krijg te zien door dat de COUNT een 0 uitkrijgt. Nu heb ik alleen in onderstaande dat de COUNT de andere 2 wel tellen, maar wanneer er een 0 uitkomt, dat hij het niet toont.

De vraag rust dan ook hoe kan ik een COUNT een '0' meegeven zodra hij niets vind met tellen van gebruikte vraagnummers door gebruikers.

Gebruik van sub-query:
Code:
SELECT DISTINCT dbo_Vraag.*,(SELECT COUNT(dbo_Gebruiker.vraagnummer) FROM dbo_Gebruiker WHERE dbo_Vraag.vraagnummer = dbo_Gebruiker.vraagnummer) AS Aantal
FROM dbo_Vraag INNER JOIN dbo_Gebruiker ON dbo_Vraag.vraagnummer = dbo_Gebruiker.vraagnummer
WHERE (((dbo_Vraag.vraagnummer)=[dbo_Gebruiker].[vraagnummer]))
ORDER BY dbo_Vraag.vraagnummer;

Zonder sub-query:
Code:
SELECT dbo_Vraag.vraagnummer, dbo_Vraag.tekstvraag, COUNT(ISNULL(dbo_Gebruiker.vraagnummer)) AS aantal
FROM dbo_Vraag INNER JOIN dbo_Gebruiker ON dbo_Vraag.vraagnummer = dbo_Gebruiker.vraagnummer
GROUP BY dbo_Vraag.vraagnummer, dbo_Vraag.tekstvraag ;

Mocht je iets niet begrijpen, laat het me even weten. Mocht er iets anders zijn wat handig zou kunnen zijn, laat dat dan ook even weten.

Met vriendelijke groet,
VreXz
 
Je moet een Outer join gebruiken. Je wilt daarbij alle records uit Vraag zien, en alleen de gerelateerde records uit Gebruiker. De Join kan een Left Join, of een Right Join zijn. Is op afstand niet te zeggen.
 
Je moet een Outer join gebruiken. Je wilt daarbij alle records uit Vraag zien, en alleen de gerelateerde records uit Gebruiker. De Join kan een Left Join, of een Right Join zijn. Is op afstand niet te zeggen.

Ik zie gewoon alle records qua vragen. Maar het probleem is dat als ik een COUNT erin zet hij de records met aantal 0 niet laat zien. Zou je voorbeeldje geven.

Vraagnummer.......TeskstVraag........................COUNT AS Aantal
0...................Welke schoenen droeg je?............. 1
1...................Welk shirt droeg je?...................... 2
2...................Welke broek droeg je?................... 0 (of niets)

De onderste regel met welke broek droeg je, laat de mijn query niet zien. Nu wil ik graag weten hoe kan ik het op bovenstaande manier laten zien, dat de record verschijnt en dat de count, niets of een 0 weergeeft

Met mijn query zie ik momenteel dit:
Vraagnummer.......TeskstVraag........................COUNT AS Aantal
0...................Welke schoenen droeg je?............. 1
1...................Welk shirt droeg je?...................... 2

De onderste regel is er dus niet en die wil ik wel graag hebben, omdat ik anders een vraag mis.

Grt VreXz
 
.... En dat moet je doen met een Outer Join. Tenzij ik me sterk vergis, maar in dat geval moet je maar een voorbeeldje posten. Bij een Inner Join zie je alleen records (of totalen) op records die in beide tabellen voorkomen. Als er geen waarde is voor de derde vraag, (en dat is zo vanwege de 0 als uitkomst) komt het record uit de tabel Vraag dus niet voor in de query. Er is immers geen record in de tabel Gebruiker. Daarom gebruik je een Outer Join, waarbij je alle records uit vragen ziet, ongeacht of ze voorkomen in Gebruiker. En guess what: die vraag krijgt dan de waarde 0!
 
Ik heb je advies opgevolgd met de code zonder subquery, de LEFT OUTER JOIN werkt wel. Echter bij de RIGHT OUTER JOIN laat hij de 3de regel niet zien.

Door een LEFT OUTER JOIN te gebruiken krijg ik nu dit:
Vraagnummer.......TeskstVraag........................COUNT AS Aantal
0...................Welke schoenen droeg je?............. 1
1...................Welk shirt droeg je?...................... 2
2...................Welke broek droeg je?................... 1

Met de volgende code:
Code:
SELECT dbo_Vraag.vraagnummer, dbo_Vraag.tekstvraag, COUNT(ISNULL(dbo_Gebruiker.vraagnummer)) AS aantal
FROM dbo_Vraag LEFT OUTER JOIN dbo_Gebruiker ON dbo_Vraag.vraagnummer=dbo_Gebruiker.vraagnummer
GROUP BY dbo_Vraag.vraagnummer, dbo_Vraag.tekstvraag;

Alleen klopt er iets niet helemaal. Er staat nu bij vraagnummer 2 dat er 1 persoon is die die vraag heeft, maar volgens mij dbo_Gebruiker (tabel) is vraagnummer 1, 2keer gebruikt en is vraagnummer 0, 1keer gebruikt. (Als ik zelf kijk in de tabel, concludeer ik dat) Vraagnummer 2 word door niemand gebruikt maar de COUNT geeft aan dat er 1 is in Aantal. Enig idee waarom?

Als ik bestanden moet sturen, dan zal ik dat wel doen, moet ze alleen even in orde maken dan voor jullie ;)

Mvgrt
 
Ik kan op basis van jouw gegevens niet zien wat er fout is, dan heb ik toch echt de echte data nodig. Left Join en Right Join zijn in beginsel hetzelfde, alleen krijg je bij Left join alle records uit tabel A, en bij Right join alle records uit tabel B. In één van de twee gevallen is de join dus hetzelfde als een Inner Join, omdat één van de twe tabellen net zoveel records laat zien als een Inner Join. In jouw geval zitten in Vraag alle records, die niet in tabel Gebruikers voorkomen. Derhalve zie je bij een Left Join alle records uit A, en bij een Right join niet, want die laten alle records uit B zien.
 
Ik kom er zelf zo 123 niet uit, zou het fijn vinden als je even zou kunnen kijken wat ik fout heb gedaan en evt mij de fout kan uitleggen of hoe je het heb opgelost. Het is een rar bestand, ik hoop dat ik het goed heb geupload aangezien dit de eerste keer is dat ik hier iets deel.

Met name gaat het over de twee query's genaamd HelpMij Access Query en HelpMij Access Query Met SubQuery.
 

Bijlagen

  • HelpMijAccessProbleem.rar
    56 KB · Weergaven: 19
Zonder tabellen kan ik er nog steeds niet zoveel mee.... je gebruikt koppelingen naar een SQL server.
 
Maar gelukkig zit ik niet voor één gat gevangen. De fout is relatief simpel: je telt op basis van de verkeerde tabel. In een Outer join wil je de records tellen die aan de veelkant zitten, in jouw geval de tabel Gebruikers. Je telt echter de vraagnummers in de tabel Vraag, en daar komt elke vraag uiteraard minstens één keer voor.

Code:
SELECT Vraag.vraagnummer, Vraag.tekstvraag, Count(Gebruiker.vraagnummer) AS Aantal
FROM Vraag LEFT JOIN Gebruiker ON Vraag.vraagnummer = Gebruiker.vraagnummer
GROUP BY Vraag.vraagnummer, Vraag.tekstvraag;
 
Kom er nog steeds niet helemaal uit hoe het nu precies moet. Heb wel een nieuwe .rar bestand waarin de DDL scripts zitten voor het aanmaken van de database, eveneens zitten de oude files er in. Ook zit er een DSN bestand in.

Hoop dat je er hiermee wel uit kan komen want ik snap er niet echt veel meer van en loop anders maar in een cirkeltje.
 

Bijlagen

  • HelpMijForum ProbleemCount.rar
    59,7 KB · Weergaven: 25
Op het werk gebruiken we nog 2003, dus ik kan er pas vanavond naar kijken.
 
Zal er vandaag naar kijken... Thuis gebruik ik 2003 en 2007, maar tegelijkertijd levert altijd problemen op, dus ik start 2007 niet altijd op. (natuurlijke weerstand...)
 
Heb het inmiddels zelf al opgelost door het volgende te doen:

[SQL]
SELECT dbo_Vraag.vraagnummer, dbo_Vraag.tekstvraag, statistieken.aantal
FROM dbo_Vraag LEFT JOIN (SELECT dbo_Vraag.vraagnummer,COUNT(dbo_Gebruiker.vraagnummer) AS aantal
FROM dbo_Vraag
LEFT JOIN dbo_Gebruiker
ON dbo_Vraag.vraagnummer = dbo_Gebruiker.vraagnummer
GROUP BY dbo_Vraag.vraagnummer) AS statistieken ON dbo_Vraag.vraagnummer = statistieken.vraagnummer;
[/SQL]

Problem solved.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan