/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
SQL sætning - problem.
Fra : SpookiePower


Dato : 21-12-07 12:44


Jeg har en SQL sætning der tæller hvor mange rapporter(antal)
der forekommer mellem kl 0 til 5 og gruppere
dem i dage. Min sætning ser således ud -

SELECT DateValue(daReportDate) AS Dato, Count(daReportDate) AS Antal
FROM TReport
WHERE hour(daReportDate) between 0 and 5
GROUP BY DateValue(daReportDate)
ORDER BY count(daReportDate) DESC;

Jeg vil nu gerne have talt hvor mange dage om året, der forekommer
en eller flere rapporter i dette tidsrum. Antallet af
rapporter er ligegyldigt.

Jeg går ud fra at det er en blanding af GROUP og ORDER
linerne jeg skal ændre på, men jeg er fuldstændigt blank.

Kan i hjælpe her ?

 
 
SpookiePower (21-12-2007)
Kommentar
Fra : SpookiePower


Dato : 21-12-07 13:18

Jeg er kommet et lille skridt videre, men nu sidder jeg fast.
Det er lykkedes mig at få de dage frem, som har en eller
flere rapporter i det valgte tidsrum -

SELECT datevalue(daReportDate)
FROM TReport
WHERE (hour(daReportDate) between 0 and 5) and (year(daReportDate)=2007)
Group by datevalue(daReportDate)

Men denne sætning viser datoerne, den kommer ikke med
et tal, som tæller disse dage.

Kan i hjælpe her ?

Peter Lykkegaard (21-12-2007)
Kommentar
Fra : Peter Lykkegaard


Dato : 21-12-07 14:35

SpookiePower wrote:
>
> Kan i hjælpe her ?

Hvilket rdbms?

Du kan evt lægge ud med at kikke på count

- Peter

--
Hi! I'm a .signature *virus*!
Copy me into your ~/.signature to help me spread!



SpookiePower (21-12-2007)
Kommentar
Fra : SpookiePower


Dato : 21-12-07 14:45

Peter Lykkegaard wrote:

> Hvilket rdbms?
>
> Du kan evt lægge ud med at kikke på count

Access 2003.

Jeg har kigget på count(*), men uden held.



Jeg har forsøgt mig på denne måde -

SELECT count(*)
FROM TReport
WHERE (hour(daReportDate) between 0 and 5) and (year(daReportDate)=2007)

Men der tæller den jo samtlige records, som forekommer mellem kl 00 til 05.



Prøver jeg på denne måde -

SELECT count(*)
FROM TReport
WHERE (hour(daReportDate) between 0 and 5) and (year(daReportDate)=2007)
GROUP BY datevalue(daReportDate);

Så grupperes der i dage, og det er disse dage jeg skal have tal på.
Men jeg er stået af nu. Løsningen er sikkert simple, men jeg er blank.

Peter Lykkegaard (21-12-2007)
Kommentar
Fra : Peter Lykkegaard


Dato : 21-12-07 16:18


"SpookiePower" wrote

> Access 2003.
>
Der er en ms-access undergruppe
Men problemstillingen er rimelig generel

> Jeg har kigget på count(*), men uden held.
>
Forklaring på count
http://www.techonthenet.com/sql/count.php
http://www.techonthenet.com/access/functions/numeric/count.php

> Jeg har forsøgt mig på denne måde -
>
> SELECT count(*)
> FROM TReport
> WHERE (hour(daReportDate) between 0 and 5) and (year(daReportDate)=2007)
>
> Men der tæller den jo samtlige records, som forekommer mellem kl 00 til
> 05.

Yes du _skal_ have en group by på
http://www.techonthenet.com/sql/group_by.php

> Prøver jeg på denne måde -
>
> SELECT count(*)
> FROM TReport
> WHERE (hour(daReportDate) between 0 and 5) and (year(daReportDate)=2007)
> GROUP BY datevalue(daReportDate);
>
Hvorfor bruger du funktionen DateValue?
Kik evt på DatePart
http://www.techonthenet.com/access/functions/date/datepart.php

> Så grupperes der i dage, og det er disse dage jeg skal have tal på.
> Men jeg er stået af nu. Løsningen er sikkert simple, men jeg er blank.

Hvad er resultatet af den sidste forespørgsel?

- Peter



Kristian Damm Jensen (22-12-2007)
Kommentar
Fra : Kristian Damm Jensen


Dato : 22-12-07 06:02

Peter Lykkegaard wrote:
> "SpookiePower" wrote
>
>> Access 2003.
>>
> Der er en ms-access undergruppe
> Men problemstillingen er rimelig generel
>
>> Jeg har kigget på count(*), men uden held.
>>
> Forklaring på count
> http://www.techonthenet.com/sql/count.php
> http://www.techonthenet.com/access/functions/numeric/count.php
>
>> Jeg har forsøgt mig på denne måde -
>>
>> SELECT count(*)
>> FROM TReport
>> WHERE (hour(daReportDate) between 0 and 5) and
>> (year(daReportDate)=2007) Men der tæller den jo samtlige records, som
>> forekommer mellem kl 00
>> til 05.
>
> Yes du _skal_ have en group by på
> http://www.techonthenet.com/sql/group_by.php

Nej.

Group by er ikke en nødvendighed for at bruge count(). Den simpleste
anvendelse af count er at optælle antallet af records i en tabel:

select count(*) from T

Men det er sjældent man har brug for en forespørgsel hvor man skal optælle
uden at gruppere. Det er imidlertid tilfældet her, da man blot skal finde
"hvor mange dage om året, der forekommer en eller flere rapporter i dette
tidsrum".

<snip>

--
Venlig hilsen /Best regards
Kristian Damm Jensen



Peter Lykkegaard (22-12-2007)
Kommentar
Fra : Peter Lykkegaard


Dato : 22-12-07 11:20

"Kristian Damm Jensen" wrote

> Men det er sjældent man har brug for en forespørgsel hvor man skal optælle
> uden at gruppere. Det er imidlertid tilfældet her, da man blot skal finde
> "hvor mange dage om året, der forekommer en eller flere rapporter i dette
> tidsrum".
>
Fra OP:

"Jeg har en SQL sætning der tæller hvor mange rapporter(antal)
der forekommer mellem kl 0 til 5 og gruppere
dem i dage"

- Peter


Kristian Damm Jensen (22-12-2007)
Kommentar
Fra : Kristian Damm Jensen


Dato : 22-12-07 16:47

Peter Lykkegaard wrote:
> "Kristian Damm Jensen" wrote
>
>> Men det er sjældent man har brug for en forespørgsel hvor man skal
>> optælle uden at gruppere. Det er imidlertid tilfældet her, da man
>> blot skal finde "hvor mange dage om året, der forekommer en eller
>> flere rapporter i dette tidsrum".
>>
> Fra OP:
>
> "Jeg har en SQL sætning der tæller hvor mange rapporter(antal)
> der forekommer mellem kl 0 til 5 og gruppere
> dem i dage"

Ja. Det er hvad han har.

"Jeg vil nu gerne have talt hvor mange dage om året, der forekommer
en eller flere rapporter i dette tidsrum. "

Det er hvad den nye SQL skal gøre. Ét tal.

--
Venlig hilsen /Best regards
Kristian Damm Jensen



Peter Lykkegaard (22-12-2007)
Kommentar
Fra : Peter Lykkegaard


Dato : 22-12-07 19:58

"Kristian Damm Jensen" wrote

> Det er hvad den nye SQL skal gøre. Ét tal.
>

Hmm :)

tak/Peter


SpookiePower (22-12-2007)
Kommentar
Fra : SpookiePower


Dato : 22-12-07 13:33

Peter Lykkegaard wrote:

> Yes du _skal_ have en group by på
> http://www.techonthenet.com/sql/group_by.php

Det håbede jeg også på var rigtigt.

> Hvorfor bruger du funktionen DateValue?
> Kik evt på DatePart
> http://www.techonthenet.com/access/functions/date/datepart.php

DatePart har jeg ikke hørt om. DateValue piller datoen ud af
det format jeg har valgt. I mit felt daReportDate står dato+tid
således 31-08-2005 15:08:00, og det er kun datoen jeg skal bruge.

>> Så grupperes der i dage, og det er disse dage jeg skal have tal på.
>> Men jeg er stået af nu. Løsningen er sikkert simple, men jeg er blank.
>
> Hvad er resultatet af den sidste forespørgsel?

Min sidste forespørgelse ser sådan ud -

10-12-2007   4
11-12-2007   12
15-12-2007   5

Her kan man se at der er 3 dage, hvor der forekommer
en eller flere records mellem klokken 0 til 5.
Men det er ikke denne liste jeg er interesserede i.
Det er tallet 3, jeg gerne vil have frem. Det er det
tal jeg skal bruge senere hen.


Kristian Damm Jensen (21-12-2007)
Kommentar
Fra : Kristian Damm Jensen


Dato : 21-12-07 16:07

SpookiePower wrote:
> Jeg er kommet et lille skridt videre, men nu sidder jeg fast.
> Det er lykkedes mig at få de dage frem, som har en eller
> flere rapporter i det valgte tidsrum -
>
> SELECT datevalue(daReportDate)
> FROM TReport
> WHERE (hour(daReportDate) between 0 and 5) and
> (year(daReportDate)=2007) Group by datevalue(daReportDate)
>
> Men denne sætning viser datoerne, den kommer ikke med
> et tal, som tæller disse dage.


Du er næsten i mål. Men:

group by er overflødig i denne konstruktion. Med mindre du bruger den til at
fjerne dubletter, i hvilket tilfælde den stilrene måde er at bruge distinct:

SELECT distinct datevalue(daReportDate)
FROM TReport
WHERE (hour(daReportDate) between 0 and 5) and (year(daReportDate)=2007)

Da vi nu har fået fjernet group by, er det muligt at bruge count uden at det
relateres til group by. Sådan:

SELECT count(distinct datevalue(daReportDate))
FROM TReport
WHERE (hour(daReportDate) between 0 and 5) and (year(daReportDate)=2007)

>
> Kan i hjælpe her ?

--
Venlig hilsen /Best regards
Kristian Damm Jensen



SpookiePower (22-12-2007)
Kommentar
Fra : SpookiePower


Dato : 22-12-07 13:37

Kristian Damm Jensen wrote:

> SELECT count(distinct datevalue(daReportDate))
> FROM TReport
> WHERE (hour(daReportDate) between 0 and 5) and (year(daReportDate)=2007)

Nu ligner det noget af det jeg søger. Mange tak :)
Men jeg får fejle -
"Der er en syntaks fejl fordi der mangler en operator i udtrykket
count(distinct datevalue(daReportDate))"

Peter Lykkegaard (22-12-2007)
Kommentar
Fra : Peter Lykkegaard


Dato : 22-12-07 15:05

"SpookiePower" wrote
> Kristian Damm Jensen wrote:
>
>> SELECT count(distinct datevalue(daReportDate))
>> FROM TReport
>> WHERE (hour(daReportDate) between 0 and 5) and (year(daReportDate)=2007)
>
> Nu ligner det noget af det jeg søger. Mange tak :)
> Men jeg får fejle -
> "Der er en syntaks fejl fordi der mangler en operator i udtrykket
> count(distinct datevalue(daReportDate))"

Det anede mig at Access muligvis ville have det lidt svært med den
konstruktion

Prøv evt dette

SELECT count(*) as AntalDage FROM (
SELECT distinct datevalue(daReportDate)
FROM TReport
WHERE (hour(daReportDate) between 0 and 5) and (year(daReportDate)=2007)
)

Jeg har testet ovenstående af i Access 2003 og det giver AntalDage = 3

- Peter


Kristian Damm Jensen (22-12-2007)
Kommentar
Fra : Kristian Damm Jensen


Dato : 22-12-07 16:57

Peter Lykkegaard wrote:
> "SpookiePower" wrote
>> Kristian Damm Jensen wrote:
>>
>>> SELECT count(distinct datevalue(daReportDate))
>>> FROM TReport
>>> WHERE (hour(daReportDate) between 0 and 5) and
>>> (year(daReportDate)=2007)
>>
>> Nu ligner det noget af det jeg søger. Mange tak :)
>> Men jeg får fejle -
>> "Der er en syntaks fejl fordi der mangler en operator i udtrykket
>> count(distinct datevalue(daReportDate))"
>
> Det anede mig at Access muligvis ville have det lidt svært med den
> konstruktion
>
> Prøv evt dette
>
> SELECT count(*) as AntalDage FROM (
> SELECT distinct datevalue(daReportDate)
> FROM TReport
> WHERE (hour(daReportDate) between 0 and 5) and
> (year(daReportDate)=2007) )
>
> Jeg har testet ovenstående af i Access 2003 og det giver AntalDage = 3

En god work-around, der burde give det samme som mit forslag.

Beklager. Jeg blevet forvænt med at antage at Access accepterer de fleste
standard sql ting, og da distinct er så gammel som den ældste sql-definition
faldt det mig ikke ind, at det ikke skulle være dækket ind.


--
Venlig hilsen /Best regards
Kristian Damm Jensen



Peter Lykkegaard (22-12-2007)
Kommentar
Fra : Peter Lykkegaard


Dato : 22-12-07 20:02

"Kristian Damm Jensen" wrote

> Beklager. Jeg blevet forvænt med at antage at Access accepterer de fleste
> standard sql ting, og da distinct er så gammel som den ældste
> sql-definition faldt det mig ikke ind, at det ikke skulle være dækket ind.
>
Distinct er understøttet bare ikke lige den konstruktion

- Peter


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste