donkazz
(11.670 point. Point ude: 1.395)
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?
Skrevet fre. d. 12. oktober 2007 kl. 11:43:11| #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
Skrevet fre. d. 12. oktober 2007 kl. 11:46:11| #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..
Skrevet fre. d. 12. oktober 2007 kl. 11:49:57| #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
Skrevet fre. d. 12. oktober 2007 kl. 11:55:57| #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
Skrevet fre. d. 12. oktober 2007 kl. 12:05:31| #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
Skrevet fre. d. 12. oktober 2007 kl. 12:43:25| #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
Skrevet fre. d. 12. oktober 2007 kl. 12:47:02| #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
Skrevet fre. d. 12. oktober 2007 kl. 12:47:59| #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
Skrevet fre. d. 12. oktober 2007 kl. 12:52:28| #9
hvad hvis jeg både skal have userName OG userID ud? :-O
Skrevet fre. d. 12. oktober 2007 kl. 12:53:27| #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
Skrevet fre. d. 12. oktober 2007 kl. 12:59:42| #11
Yeees.... fredag = snart fri = bælgøjne. My bad. ;)
Tak for hjælpen!
Skrevet fre. d. 12. oktober 2007 kl. 13:00:41| #12
Skrevet fre. d. 12. oktober 2007 kl. 13:02:21| #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?
Skrevet fre. d. 12. oktober 2007 kl. 13:25:39| #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:)
Skrevet fre. d. 12. oktober 2007 kl. 13:33:51| #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/ (...)
Skrevet fre. d. 12. oktober 2007 kl. 13:34:39| #16
kan du ikke lige skrive hvad dine kolonner hedder i de tabeller jeg skal bruge til sql'en?
Skrevet fre. d. 12. oktober 2007 kl. 13:34:55| #17
og skriv dem korrekt uden stavefejl:o)
Skrevet fre. d. 12. oktober 2007 kl. 13:59:29| #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
:)
Skrevet fre. d. 12. oktober 2007 kl. 14:20:21| #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
Skrevet fre. d. 12. oktober 2007 kl. 14:30:18| #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
Skrevet fre. d. 12. oktober 2007 kl. 14:36:43| #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
Skrevet fre. d. 12. oktober 2007 kl. 14:45:07| #22
Der kommer timeout denne gang :-|
Skrevet fre. d. 12. oktober 2007 kl. 14:48:40| #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
Skrevet lør. d. 13. oktober 2007 kl. 12:30:55| #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 :)