webForumDet fria alternativet

Är denna sql också klumpigt gjord?

Databaser & SQLur Databashanterare & SQL

8 svar · 813 visningar · startad av saw

sawMedlem sedan mars 20011 880 inlägg
#1

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

LarsGMedlem sedan dec. 200012 464 inlägg
#2
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.

sawMedlem sedan mars 20011 880 inlägg
#3

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.

LarsGMedlem sedan dec. 200012 464 inlägg
#4

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.

nitro2k01Medlem sedan aug. 20039 342 inlägg
#5

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?

LarsGMedlem sedan dec. 200012 464 inlägg
#6

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

sawMedlem sedan mars 20011 880 inlägg
#7

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

@ndersMedlem sedan juni 200032 969 inlägg
#8

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

sawMedlem sedan mars 20011 880 inlägg
#9

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....

134 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)