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.
8 svar · 813 visningar · startad av saw
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
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.
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.
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.
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?
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
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
WHERE ska in före GROUP BY - flytta nämnda villkor dit.
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....