---
title: "Är denna sql också klumpigt gjord?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/183357-är-denna-sql-också-klumpigt-gjord"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "saw"
published: "2010-04-29T18:51:56.000Z"
updated: "2010-05-01T13:20:40.000Z"
replies: 8
views: 841
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/183357-är-denna-sql-också-klumpigt-gjord"
---

# Är denna sql också klumpigt gjord?

## #1 — saw, 2010-04-29T18:51Z

Jag vore tacksam för tips ang min nya sql, den fungerar men jag vet sen
 gammalt att när experterna börja att kolla, då är nog inte denna sql mycket
 värd...  ;)

```

SELECT Format(Date(),'yyyy') AS Ar,
Format(Date(),'mmmm') AS Manad, 
Sum(t_tidsrapportPerson.fullTid) AS [Tim/man],
 t_tidsrapportPerson.fullTid AS [Tim/dag], 
Count(t_tidsrapportPerson.fullTid) AS Dagar, t_person.namn, t_tidsRapport.personId
FROM t_tidsrapportPerson
INNER JOIN (t_person INNER JOIN t_tidsRapport 
ON t_person.personId = t_tidsRapport.personId) 
ON t_tidsrapportPerson.rappPersonId = t_tidsRapport.rappPersonId
GROUP BY 
Format(Date(),'mmmm'), t_tidsrapportPerson.fullTid, t_person.namn, t_tidsRapport.personId
HAVING 
(((Format(Date(),'yyyy'))=2010)
 AND ((Format(Date(),'mmmm'))='april') 
AND ((Sum(t_tidsrapportPerson.fullTid))>0) 
AND ((Count(t_tidsrapportPerson.fullTid))>0))
ORDER BY t_person.namn;
```

Resultatet jag vill ha fram är:
Vilket år
Vilken månad
Arbetade timmar i april ( enligt min sökning)
Timmar/dag
Antal dagar i denna månaden (eftersom det enbart sparas fullTid på
 arbetsdagar så blir sökningen \>0)
Namn
Id.

Är jag helt fel ute  :stud

Permalänk: https://www.webforum.nu/p/183357

## #2 — LarsG, 2010-04-30T08:16Z

```
HAVING 
(((Format(Date(),'yyyy'))=2010)
 AND ((Format(Date(),'mmmm'))='april')
```

skall ligga i en whereklausul. Bortsett från det så är det en massa onödiga parenteser.

Permalänk: https://www.webforum.nu/p/2234091

## #3 — saw, 2010-04-30T09:21Z

Hej LarsG, om jag förstår dig rätt, så skall jag bara byta ut having mot where?
Paranteserna har jag ännu inte hunnit rensa men de skall ju bort.

Permalänk: https://www.webforum.nu/p/2234098

## #4 — LarsG, 2010-04-30T10:23Z

Nej, när du använder sum och count i villkoret så måste det ligga i having, så du får dela upp din nuvarande having i två delar. 

Du behöver inte heller ha med 

```
Format(Date(),'mmmm')
```

i group by då det är en konstant.

Permalänk: https://www.webforum.nu/p/2234101

## #5 — nitro2k01, 2010-04-30T12:21Z

LarsG: Det där med använda where (utöver having) var min idé. Jag har fått för mig att resultatet från allt som kommer innan GROUP BY måste skapas och lagras temporärt innan HAVING-kriterierna kan evalueras och att det därför kan vara en bra idé att förhandssortera med WHERE. Främst då datumkriterier, så att man slipper beräkna SUM och COUNT för en massa rader som slängs iväg.
Iofs kanske vissa DBMS'er är smartare än andra?

Permalänk: https://www.webforum.nu/p/2234105

## #6 — LarsG, 2010-04-30T12:41Z

Det kan mycket väl vara så att vissa DBMS flyttar om villkoren. Det blir i alla fall inte sämre om man lägger dom i where

Permalänk: https://www.webforum.nu/p/2234106

## #7 — saw, 2010-04-30T13:14Z

Jag är ledsen men jag tror inte att jag förstår hur LarsG menar.
Så här ser sql:en ut nu med lite mera tillägg och bortplockade parenteser:

```
SELECT 
Format(Date(),'yyyy') AS Ar, 
Format(Date(),'mmmm') AS Manad, 
Sum(t_tidsrapportPerson.fullTid) AS [Tim/man], 
Count(t_tidsrapportPerson.fullTid) AS Dagar, 
t_person.arbetstid AS Schemalagd, 
t_tidsrapportPerson.fullTid AS [Tim/dag],
t_person.namn, 
t_tidsRapport.personId
FROM 
t_tidsrapportPerson 
INNER JOIN 
(t_person 
INNER JOIN t_tidsRapport 
ON t_person.personId = t_tidsRapport.personId) 
ON t_tidsrapportPerson.rappPersonId = t_tidsRapport.rappPersonId
GROUP BY 
t_person.arbetstid, 
t_tidsrapportPerson.fullTid, 
t_person.namn, 
t_tidsRapport.personId
HAVING 
(Format(Date(),'yyyy')=2010 
AND 
Format(Date(),'mmmm')='april' 
AND
Sum(t_tidsrapportPerson.fullTid)>0 
AND 
Count(t_tidsrapportPerson.fullTid)>0)
ORDER BY 
t_person.namn;
```

Hur är det tänkt att jag skall ha en where-sats här?  :stud

Permalänk: https://www.webforum.nu/p/2234107

## #8 — @nders, 2010-05-01T05:41Z

WHERE ska in före GROUP BY - flytta nämnda villkor dit.

Permalänk: https://www.webforum.nu/p/2234156

## #9 — saw, 2010-05-01T13:20Z

Mera fel

Då vi kom in i en ny månad så upptäckte jag ett nytt grovt fel av mig, som
 någon tidigare har påpekat, men jag inte reagerat för.
Det gäller min formatering av månad och år. Som jag hadde det så
 formarterades tiden till nu..
När jag försöker ändra så fick jag error..

```
SELECT 
Format([datum],'yyyy') AS Ar, 
Format([datum],'mmmm') AS Manad, 
Sum(t_tidsrapportPerson.fullTid) AS [Tim/man], 
Count(t_tidsrapportPerson.fullTid) AS Dagar, 
t_person.arbetstid AS Schemalagd,
t_tidsrapportPerson.fullTid AS [Tim/dag],
t_person.namn,
t_tidsRapport.personId
FROM
t_tidsrapportPerson
INNER JOIN
(t_person
INNER JOIN
t_tidsRapport 
ON
t_person.personId = t_tidsRapport.personId) 
ON
t_tidsrapportPerson.rappPersonId = t_tidsRapport.rappPersonId
GROUP BY
t_person.arbetstid,
t_tidsrapportPerson.fullTid,
t_person.namn,
t_tidsRapport.personId
HAVING
(((Format([datum],'yyyy'))=2010) 
AND
 ((Format([datum],'mmmm'))="april") 
AND 
((Sum(t_tidsrapportPerson.fullTid))>0) 
AND
((Count(t_tidsrapportPerson.fullTid))>0))
ORDER BY
t_person.namn;
```

ERROR:
**Du försöker köra en fråga med en mängdfunktion som inte innehöll det angivna uttrycket 'Format(\[datum\],'yyyy')**
Jag som trodde att jag var på rätt väg... :OO

\[REDIGERAT\]
Nja det löste sig, men jag får fortfarande inte till någon where-sats utan att det blir fel

```
SELECT 
Format([datum],'yyyy') AS Ar, 
Format([datum],'mmmm') AS Manad, 
Sum(t_tidsrapportPerson.fullTid) AS [Tim/mån], 
Count(t_tidsrapportPerson.fullTid) AS Dagar,
 t_person.arbetstid AS Scemalagt,
 t_tidsrapportPerson.fullTid AS [Tim/dag],
 t_person.namn, t_person.personId
FROM t_tidsrapportPerson
 INNER JOIN
 (t_person INNER JOIN t_tidsRapport
ON
 t_person.personId = t_tidsRapport.personId) 
ON
t_tidsrapportPerson.rappPersonId = t_tidsRapport.rappPersonId
GROUP BY
Format([datum],'yyyy'), 
Format([datum],'mmmm'),
 t_person.arbetstid,
 t_tidsrapportPerson.fullTid, t_person.namn,
 t_person.personId
HAVING 
(((Format([datum],'yyyy'))=2010) 
AND 
((Format([datum],'mmmm'))="april") 
AND 
((t_tidsrapportPerson.fullTid)>0));
```

Detta fungerar nu....

Permalänk: https://www.webforum.nu/p/2234177

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/183357-är-denna-sql-också-klumpigt-gjord
