Avatar billede jensen2005 Nybegynder
24. august 2012 - 20:05 Der er 8 kommentarer og
1 løsning

SQL: Returner "COUNT() = 0" selvom WHERE ikke returner en række

Hej Eksperter

Herunder er en SQL som jeg har roddet med hele dagen!!!

Kort forklaring:
SQL'en herunder virker fint hvis jeg med WHERE rammer inden for en dato hvor der returneres en række.

Men hvis jeg ikke rammer inden for en dato som returnerer en række vil jeg gerne have at SQL'en returnere antal = 0

SELECT

OY_loesning.id,

OY_loesning.titel,

COUNT(OY_resultat.loesningsid) AS antal,

CAST(AVG(CAST(OY_resultat.sp1 AS Decimal(10, 2))) * 20 AS Decimal(10, 0)) AS SP1,

FROM OY_loesning

LEFT OUTER JOIN OY_resultat ON OY_loesning.id = OY_resultat.loesningsid

WHERE (OY_loesning.sbuid = @sbuid) AND (OY_resultat.dato > @starttid + '00:00:00') AND (OY_resultat.dato < @sluttid + '23:59:59')

GROUP BY OY_loesning.id, OY_loesning.titel
Avatar billede softspot Forsker
25. august 2012 - 02:19 #1
Hvis jeg forstår dig korrekt, så vil du have at feltet antal indeholder 0, hvis der ikke er nogle resultater, eller er det misforstået?

Hvis det er korrekt, så er det jo ikke muligt at få en række tilbage, hvis der ikke er nogle resultater og dermed kan du heller ikke få adgang til kolonnen antal, da det er en optælling ifht. et datasæt, hvilke der jo ikke er nogle af.

Hvis du vil have at vide hvormange rækker der er, skal du nok lave en optælling af antal række i dit udtræk i et separat kald inden du udfører det kald du har vist i dit spørgsmål, dvs. noget i stil med dette:

SELECT COUNT(*)
FROM (
  SELECT
    OY_loesning.id,
    OY_loesning.titel,
    COUNT(OY_resultat.loesningsid) AS antal,
    CAST(AVG(CAST(OY_resultat.sp1 AS Decimal(10, 2))) * 20 AS Decimal(10, 0)) AS SP1,
  FROM OY_loesning
    LEFT OUTER JOIN OY_resultat ON OY_loesning.id = OY_resultat.loesningsid
  WHERE (OY_loesning.sbuid = @sbuid)
    AND (OY_resultat.dato > @starttid + '00:00:00')
    AND (OY_resultat.dato < @sluttid + '23:59:59')
  GROUP BY
    OY_loesning.id,
    OY_loesning.titel
)
Avatar billede jensen2005 Nybegynder
25. august 2012 - 03:40 #2
Jeg softspot

Det er ikke helt det jeg er ude efter. Det jeg mener er at hvis jeg ikke rammer inden for en dato som returnerer en række vil jeg gerne have at SQL'en returnere:

OY_loesning.id = id'et,  OY_loesning.titel = titlen, Antal = Som så må være 0, OY_resultat.sp1

Beklager den uklare formulering i første indlæg.
Avatar billede softspot Forsker
25. august 2012 - 09:10 #3
OK, det kan være din CAST til Decimal ikke fungerer på NULL-værdier og rækker med NULL i OY_resultat.sp1 derfor helt fjernes fra resultatet. Prøv evt. dette i stedet:

SELECT
    OY_loesning.id,
    OY_loesning.titel,
    COUNT(OY_resultat.loesningsid) AS antal,
    CAST(AVG(CAST(ISNULL(OY_resultat.sp1,0) AS Decimal(10, 2))) * 20 AS Decimal(10, 0)) AS SP1,
FROM OY_loesning
    LEFT OUTER JOIN OY_resultat ON OY_loesning.id = OY_resultat.loesningsid
WHERE (OY_loesning.sbuid = @sbuid)
    AND (OY_resultat.dato > @starttid + '00:00:00')
    AND (OY_resultat.dato < @sluttid + '23:59:59')
GROUP BY
    OY_loesning.id,
    OY_loesning.titel
Avatar billede softspot Forsker
25. august 2012 - 09:11 #4
Hov! Der er lige et komma for meget efter det sidste felt i select-listen:

SELECT
    OY_loesning.id,
    OY_loesning.titel,
    COUNT(OY_resultat.loesningsid) AS antal,
    CAST(AVG(CAST(ISNULL(OY_resultat.sp1,0) AS Decimal(10, 2))) * 20 AS Decimal(10, 0)) AS SP1
FROM OY_loesning
    LEFT OUTER JOIN OY_resultat ON OY_loesning.id = OY_resultat.loesningsid
WHERE (OY_loesning.sbuid = @sbuid)
    AND (OY_resultat.dato > @starttid + '00:00:00')
    AND (OY_resultat.dato < @sluttid + '23:59:59')
GROUP BY
    OY_loesning.id,
    OY_loesning.titel
Avatar billede jensen2005 Nybegynder
26. august 2012 - 13:26 #5
Æv nej det virker heller ikke!

Tak for input ;)
Avatar billede softspot Forsker
26. august 2012 - 13:33 #6
Kan du ikke prøve at illustrere dine tabellers layout (og nogle testdata), så jeg evt. selv kan prøve at sætte det op i en testdatabase og fedte lidt med det...? Jeg er ikke hård nok til SQL, til at kunne hoste en løsning op uden at nørkle lidt med det :-)

Jeg har kun adgang til SQL Server, så hvis det er MySQL kan jeg nok ikke hjælpe, desværre... :-(
Avatar billede jensen2005 Nybegynder
11. september 2012 - 11:01 #7
Hej Softspot

Undskyld at jeg ikke har svaret før. Jeg opgav at finde en løsning og lavede i stedet en workaround. Lig et svar så du kan få dine point ;)

Vh Jensen2005
Avatar billede jensen2005 Nybegynder
11. september 2012 - 11:01 #8
Hej Softspot

Undskyld at jeg ikke har svaret før. Jeg opgav at finde en løsning og lavede i stedet en workaround. Lig et svar så du kan få dine point ;)

Vh Jensen2005
Avatar billede softspot Forsker
11. september 2012 - 11:08 #9
OK, bare du kom i mål :)
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
Kurser inden for grundlæggende programmering

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



Seneste spørgsmål Seneste aktivitet
I dag 06:10 Excel åbner fil i kæmpe format Af Aske i Excel
I går 22:00 Datafordeler Af Lsk i PHP
I går 12:37 Summere beløb pr. dato Af TTA i Excel
31/1022:44 Tilslutte chassic fans Af viking69 i PC
31/1020:28 LED lysstofrør Af ErikHg i Fri debat