Oprettet fre. d. 12. oktober 2007 kl. 11:34:46

donkazz
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

nielle
nielle (159.526 point)
> 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

kalp
kalp (244.223 point)
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

nielle
nielle (159.526 point)
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

kalp
kalp (244.223 point)
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

kalp
kalp (244.223 point)
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

donkazz
donkazz (11.670 point)
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

kalp
kalp (244.223 point)
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

kalp
kalp (244.223 point)
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

donkazz
donkazz (11.670 point)
hvad hvis jeg både skal have userName OG userID ud? :-O

Skrevet fre. d. 12. oktober 2007 kl. 12:53:27| #10

kalp
kalp (244.223 point)
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

donkazz
donkazz (11.670 point)
Yeees.... fredag = snart fri = bælgøjne. My bad. ;)

Tak for hjælpen!

Skrevet fre. d. 12. oktober 2007 kl. 13:00:41| #12

kalp
kalp (244.223 point)
selv tak:)

Skrevet fre. d. 12. oktober 2007 kl. 13:02:21| #13

donkazz
donkazz (11.670 point)
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

kalp
kalp (244.223 point)
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

donkazz
donkazz (11.670 point)
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

kalp
kalp (244.223 point)
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

kalp
kalp (244.223 point)
og skriv dem korrekt uden stavefejl:o)

Skrevet fre. d. 12. oktober 2007 kl. 13:59:29| #18

donkazz
donkazz (11.670 point)
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

kalp
kalp (244.223 point)
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

donkazz
donkazz (11.670 point)
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

kalp
kalp (244.223 point)
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

donkazz
donkazz (11.670 point)
Der kommer timeout denne gang :-|

Skrevet fre. d. 12. oktober 2007 kl. 14:48:40| #23

kalp
kalp (244.223 point)
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

donkazz
donkazz (11.670 point)
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 :)

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

ASP: formular udtræk med mulighed for at rette

Oprettet den 21. maj 2012 kl. 15.09
quarkb giver 200 point for svar | Giv et svar »

Sorter biblioteker efter dato i ASP

Oprettet den 17. maj 2012 kl. 16.52
4ks giver 60 point for svar | Giv et svar »

Simpel login-funktion (web) - behov for flere logins/brugere

Oprettet den 15. maj 2012 kl. 09.54
madx giver 75 point for svar | Giv et svar »



   




Tips & Tricks fra PC World

Teaser billede

Læserne: Her er vores værste it-indkøb

Det er ikke al it-udstyr, som er det rene guld. Her er nogle af læsernes skrækhistorier.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan siger du farvel til Facebook

Læs her, hvordan du dropper Facebook og i stedet anvender nogle brugervenlige alternativer, så du stadig kan være social på nettet.


Nyheder fra Computerworld

Teaser billede

Galleri: De fedeste håndholdte gennem 40 år

Her har du de mest banebrydende håndholdte computere gennem alle tider.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger