12. oktober 2007 - 11:34Der 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.. :(
Et nyt nationalt initiativ fra Industriens Fond, EIFO og Innovationsfonden – eksekveret af DTU Science Park og Teknologisk Institut– skal bygge bro mellem startups, SMV’er og Forsvaret.
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..
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..
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
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.
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
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
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?
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:)
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.
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
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
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
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
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 :)
Synes godt om
Ny brugerNybegynder
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.