Avatar billede donkazz Nybegynder
12. oktober 2007 - 11:34 Der er 23 kommentarer og
1 løsning

Forbandede GROUP BY og HAVING og aggregate lal

Hej!

Først, et rant:
Jeg forstår simpelthen ikke hvad man skal bruge group by til når man ikke kan opstille betingelser for de felter den skal vælge!

og så, til spørgsmålet:
Det er et simpelt fitness booking system jeg sidder og piller ved.
Jeg har en tabel der hedder "bookings" hvor jeg vil hive alle bookings ud der har bookingStatus = 1 og bookingDate < "I dag" (= ikke fremmødt)
Jeg vil gerne have det GROUP'ed BY på userID, så jeg får en liste alá følgende:
USERID - ANTAL UDEBLIVELSER
11312 - 2
4543 - 1
3564 - 5
osv. osv.

Jeg prøvede den her:
"SELECT count(bookingId) AS total, userID FROM bookings GROUP BY userID"

Og den virker "fint", bortset fra at så snart jeg prøver at smide betingelserne på (bookingStatus = 1 og bookingDate < i dag), så kommer den der "not part of the aggregate function" satans besked.. :(

What to dooo?
Avatar billede nielle Nybegynder
12. oktober 2007 - 11:43 #1
> Jeg forstår simpelthen ikke hvad man skal bruge group by til når man ikke kan opstille betingelser for de felter den skal vælge!

Kunne du eventuelt uddybe lidt hvad du mener.

Hvad med dette:

SELECT count(bookingId) AS total, userID
FROM bookings
WHERE bookingStatus = 1 AND bookingDate < date()
GROUP BY userID
Avatar billede kalp Novice
12. oktober 2007 - 11:46 #2
SELECT count(bookingId) AS total, userID FROM bookings where userID in (select UserId as currentUser, bookingStatus, bookingDate from bookings where bookingStatus = 1 and DATEDIFF(d,bookingDate,getdate()) = 0)  GROUP BY userID


den skal nok tilpasses en smule for sql fejl:)
men du skal i den retning..
Avatar billede nielle Nybegynder
12. oktober 2007 - 11:49 #3
Det giver ikke mening at counte på bookingId med mindre den også er i GROUP BY:

SELECT userID, bookingId, count(bookingId) AS total,
FROM bookings
WHERE bookingStatus = 1 AND bookingDate < date()
GROUP BY userID, bookingId
Avatar billede kalp Novice
12. oktober 2007 - 11:55 #4
SELECT count(bookingId) AS total, userID FROM bookings where userID in (select UserId as currentUser, bookingStatus, bookingDate from bookings where bookingStatus = 1 and DATEDIFF(dd,bookingDate,getdate()) = 0)  GROUP BY userID

der manglede vidst bare et "d" i min funktion, men den er der nu..
hvis den fejler så skal du bare give midter sql'en et alias navn da den så konflikter med den anden..

dvs.. from bookings as bookingstwo
Avatar billede kalp Novice
12. oktober 2007 - 12:05 #5
SELECT count(bookingId) AS total, userID FROM bookings where userID in (select UserId as currentUser from bookings as boook where boook.bookingStatus = 1 and DATEDIFF(dd,boook.bookingDate,getdate()) = 0)  GROUP BY userID

sådan.. sidste kommentar:P
Avatar billede donkazz Nybegynder
12. oktober 2007 - 12:43 #6
uuuh nice :-D

jeg ved godt det er udover mit første spørgsmål, men lad os sige vi ville have user's navn i stedet for kun id, ville det være svært? ;)
tabellen hedder users med felterne: userId og userName.

:-D
Avatar billede kalp Novice
12. oktober 2007 - 12:47 #7
du kunne have sagt hvem af os der har lavet den korrekte sql så vi ikke begge retter i hver sin:)

hvis det er min.. så

SELECT count(bookingId) AS total, userID, userName FROM bookings where userID in (select UserId as currentUser from bookings as boook where boook.bookingStatus = 1 and DATEDIFF(dd,boook.bookingDate,getdate()) = 0)  GROUP BY userID, userName
Avatar billede kalp Novice
12. oktober 2007 - 12:47 #8
hvis det kun skal være username

SELECT count(bookingId) AS total, userName FROM bookings where userName in (select userName as currentUser from bookings as boook where boook.bookingStatus = 1 and DATEDIFF(dd,boook.bookingDate,getdate()) = 0)  GROUP BY userName
Avatar billede donkazz Nybegynder
12. oktober 2007 - 12:52 #9
hvad hvis jeg både skal have userName OG userID ud? :-O
Avatar billede kalp Novice
12. oktober 2007 - 12:53 #10
ja det har jeg så vist dig.. jeg kom med 2 eksempler til dig.. det første tager begge ud og den anden kun username..

Kommentar: kalp
12/10-2007 12:47:02
Avatar billede donkazz Nybegynder
12. oktober 2007 - 12:59 #11
Yeees.... fredag = snart fri = bælgøjne. My bad. ;)

Tak for hjælpen!
Avatar billede kalp Novice
12. oktober 2007 - 13:00 #12
selv tak:)
Avatar billede donkazz Nybegynder
12. oktober 2007 - 13:02 #13
aaah jeg ser en fejl... userName er jo i en anden tabel, nemlig "users". Det er kun userID der går igen i bookings tabellen.. laver man en inner join eller noget?
Avatar billede kalp Novice
12. oktober 2007 - 13:25 #14
SELECT count(bookings.bookingId) AS total, bookings.userID, bookings.userName FROM bookings, users where bookings.userID in (select users.UserId from bookings as boook,users where boook.bookingStatus = 1 and DATEDIFF(dd,boook.bookingDate,getdate()) = 0 and boook.userID = users.userID)  GROUP BY bookings.userID, bookings.userName


hvis jeg gætter rigtigt på dine kolonne navne så vil det der nok fungerer.
men har skrevet det i min boks her på E så det er ikke helt overskueligt:)
Avatar billede donkazz Nybegynder
12. oktober 2007 - 13:33 #15
Uhm den siger følgende:

SELECT count(bookings.bookingId) AS total, bookings.userID, bookings.userName FROM bookings, users where bookings.userID in (select users.UserId from bookings as boook,users where boook.bookingStatus = 1 and boook.bookingDate < bookings.bookingDate and boook.userID = users.userID) GROUP BY bookings.userID, bookings.userName

Microsoft OLE DB Provider for ODBC Drivers error '80040e10'

[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.

Svar også lige på den her så du kan få de resterende point når tid er ;)
http://www.eksperten.dk/spm/800702
Avatar billede kalp Novice
12. oktober 2007 - 13:34 #16
kan du ikke lige skrive hvad dine kolonner hedder i de tabeller jeg skal bruge til sql'en?
Avatar billede kalp Novice
12. oktober 2007 - 13:34 #17
og skriv dem korrekt uden stavefejl:o)
Avatar billede donkazz Nybegynder
12. oktober 2007 - 13:59 #18
2 tabeller: "bookings" og "users"

"bookings"
bookingID
userID
bookingStatus
bookingDate

"users"
userID
userName
userType

Hvis du kan smide endnu en betingelse på ville det være top dollar. [users.userType] skal være = 4

:)
Avatar billede kalp Novice
12. oktober 2007 - 14:20 #19
SELECT count(bookings.bookingId) AS total, users.userID, users.userName FROM bookings, users where users.userID in (select userlist.UserId as currentUser from bookings as boook,users as userlist where boook.bookingStatus = 1 and DATEDIFF(dd,boook.bookingDate,getdate()) = 0 and userlist.userType = 4 and boook.userID = userlist.userID)  GROUP BY users.userID, users.userName
Avatar billede donkazz Nybegynder
12. oktober 2007 - 14:30 #20
Nu bliver "total" nummeret urealistisk højt... den står og indlæser i meeeeget lang tid, så jeg kunne forestille mig den fanger sig selv i noget loop, for jeg har kigget direkte i databasen og det højeste antal "total" er omkring 60, ellers ligger det på et sted mellem 1 og 20.
Nu ligger "total" mellem 400 og 3000 pr. user :-O
Avatar billede kalp Novice
12. oktober 2007 - 14:36 #21
kan godt være der skal være en left join men kan du ikke først afprøve


SELECT count(bookings.bookingId) AS total, users.userID, users.userName FROM bookings, users where users.userID in (select distinct(userlist.UserId) as currentUser from bookings as boook,users as userlist where boook.bookingStatus = 1 and DATEDIFF(dd,boook.bookingDate,getdate()) = 0 and userlist.userType = 4 and boook.userID = userlist.userID)  GROUP BY users.userID, users.userName
Avatar billede donkazz Nybegynder
12. oktober 2007 - 14:45 #22
Der kommer timeout denne gang :-|
Avatar billede kalp Novice
12. oktober 2007 - 14:48 #23
SELECT count(bookings.bookingId) AS total, users.userID, users.userName FROM bookings, users where bookings.userID in (select users.UserId from bookings as boook,users where boook.bookingStatus = 1 and boook.bookingDate < bookings.bookingDate and boook.userID = users.userID) GROUP BY users.userID, users.userName

vi prøver lige med noget simplere.. hvis den virker må jeg bygge ud på den.
det er lidt svært uden at kunne teste på noget:P
Avatar billede donkazz Nybegynder
13. oktober 2007 - 12:30 #24
hehe.. nu har alle 2741 udeblivelser :-D det var vist ikke helt meningen.. men du har ret, når du ikke kan teste bliver det lige dét mere tricky :)
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