Avatar billede mailand Nybegynder
15. april 2004 - 15:59 Der er 2 kommentarer og
1 løsning

count(distinct) giver 0

Hej der...

Jeg har en lille sql streng, der gerne skulle give mig nogle talvaerdier til noget statistik... Det fungerer ogsa i udgangpunktet godt nok - dog ikke, hvis en af de forespurgte tabeller ingen records har, saa bliver alle returnerede vaerdier 0. Hvordan kan det vaere - og kan man omgaa det?

Min SQL:
SELECT COUNT(r_id), COUNT(DISTINCT rc_referralid), COUNT(DISTINCT c_id), COUNT(DISTINCT s_id) FROM referral_referrals,referral_referral_contractors,referral_contractors,referral_surveys"

Tabellen referral_surveys har ingen records. Undlades denne taelles der rigtigt op...

#Mailand
Avatar billede mailand Nybegynder
15. april 2004 - 16:00 #1
Proevede ogsaa dette med samme resultat:

SELECT COUNT(DISTINCT referral_referrals.r_id),COUNT(DISTINCT referral_referral_contractors.rc_referralid),COUNT(DISTINCT referral_contractors.c_id),COUNT(DISTINCT referral_surveys.s_id) FROM referral_referrals,referral_referral_contractors,referral_contractors,referral_surveys
Avatar billede trer Nybegynder
15. april 2004 - 22:41 #2
Den måde du har skrevet den sql på, kan lægge enhver server ned - og vil gøre det såfremt der er ret mange data i tabellerne.

Du har nemlig ikke angivet join-kriterier i mellem tabellerne - dermed siger du, at SQL Server skal gange antallet af rækker i hver tabel med antallet af rækker i de øvrige tabeller.  Det kaldes en CROSS JOIN eller et kartesisk produkt.

Er der blot 10 rækker i hver af dine tabeller bliver det til 10x10x10x10 = 10.000 rækker som skal optælles. Med 1000 rækker i hver bliver det ganske uhyggeligt!

Det er også derfor du har opdaget at du skal bruge COUNT(DISTICT x) for at undgå dubletterne i optællingen - men det gør faktisk belastningen af serveren værre da de mange mange rækker nu skal sorteres af SQL Server.

Hvis det du forsøger er at få optalt antal rækker i hver tabel for sig og få samlet resultatet i en række - så vil nedenstående virke væsentlig bedre, samt løse dit problem med 0 rækker:

select
  (select count(*) from referral_referrals) as RR,
  (select count(*) from referral_referrals_contractors) as RRC,
  (select count(*) from referral_contractors) as RC,
  (select count(*) from referral_surveys) as RS
Avatar billede mailand Nybegynder
15. april 2004 - 23:43 #3
topdollar du!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester