06. februar 2007 - 11:56Der er
27 kommentarer og 1 løsning
Skal have samlet sum
Heysa
Jeg skal grafisk vise et gæste tal via en SQL forespørgsel. Jeg skal vise et samlet gæsteantal for dagen samt et her og nu gæsteantal, f.eks.:
Gæster nu: 23 Gæster i alt: 33
Jeg har en tabel: GAESTER hvor jeg har henholdsvis kolonnerne indgange og udgange. Der kan være flere records der skal summeres i tabellen så jeg skal kunne lægge alle tal i indgange sammen og fremvise dette tal som et samlet antal gæster for dagen. Derudover skal jeg kunne trække tallet i udgange fra tallet i indgange for at fremvise et her og nu gæsteantal.
Du kan lave en samlet forespørgsel således, og måske kan den også forenkles noget:
Select Sum(GæsterNu) as GæsterNu , GæsterIDag = Sum(GæstreNu) + Sum(GæsterUdIDag) From ( select GæsterNu = Count(Indgang), null as GæsterUdIDag from Gaester where Udgang is null union Select null as GæsterNu, GæsterUdIDag = Count(Udgang) from Gaester where Udgang >= select cast(floor(cast(getdate() as float)) as datetime) )
Nu er det ikke mig der har lavet DB men vores leverandør, men ud fra hvad jeg kan se via Enterprise manager -> Design table er at indgange og udgange er lig datatype: int, lenght: 4 og Allows nulls feltet er tomt.
Systemet summerer selv op hver 15. minut, det vil sige jeg får en record hver 15. minut hvori der står antal indgange og antal udgange, f.eks. i samme record: Dato Indgange Udgange 2007-02-06 11:00:00.000 23 13 2007-02-06 11:15:00.000 17 10 2007-02-06 11:30:00.000 10 15
Tæller du kun gæster som kommer den aktuelle dag, dvs. at der ikke er noge som overnatter (hvis vi nu taler om hotel/overnatningssted)?
Hvis der ikke er gæster som skal tælles med fra dagen inden, kan du lave følgende for at få status lige nu:
Select (Sum(Indgang) - Sum(Udgang)) as GæsterNu, Sum(Indgang) as GæsterIAlt from Gaester where Udgang >= select cast(floor(cast(getdate() as float)) as datetime)
Select (Sum(Indgang) - Sum(Udgang)) as GæsterNu, Sum(Indgang) as GæsterIAlt from Gaester where Udgang >= cast(floor(cast(getdate() as float)) as datetime)
Det skal selvfølgelig ikke være Udgang i where, men dato:
Select (Sum(Indgang) - Sum(Udgang)) as GæsterNu, Sum(Indgang) as GæsterIAlt from Gaester where Dato >= cast(floor(cast(getdate() as float)) as datetime)
Jeg kan se at feltnavnene er forkærte. Se eventuelt om følgende hjælper:
Select (Sum(Indgange) - Sum(Udgange)) as GæsterNu, Sum(Indgange) as GæsterIAlt from Gaester where Dato >= cast(floor(cast(getdate() as float)) as datetime)
får jeg: Server: Msg 207, Level 16, State 3, Line 1 Invalid column name 'Dato'. Server: Msg 207, Level 16, State 1, Line 1 Invalid column name 'Dato'. Server: Msg 207, Level 16, State 1, Line 1 Invalid column name 'Dato'.
En gang mere: Når jeg kører: Select (Sum(Indgange) - Sum(Udgange)) as GæsterNu, Sum(Indgange) as GæsterIAlt from Gaester where Dato >= cast(floor(cast(getdate() as float)) as datetime) får jeg: Server: Msg 207, Level 16, State 3, Line 1 Invalid column name 'Dato'. Server: Msg 207, Level 16, State 1, Line 1 Invalid column name 'Dato'. Server: Msg 207, Level 16, State 1, Line 1 Invalid column name 'Dato'.
Det kan være du skal have date i klamme-parantes, da det er et reserveret ord på SQL Server:
Select (Sum(Indgange) - Sum(Udgange)) as GæsterNu, Sum(Indgange) as GæsterIAlt from Gaester where [Date] >= cast(floor(cast(getdate() as float)) as datetime)
Det ser ud til det virker nu - jeg har dog en enkelt ting mere. Jeg har flere ind og udgange i området så lige nu kan jeg se at jeg tæller på alle sammen. Jeg skal kun tælle indgange på note=1 og udgange på note=2.
Kan det være både indgang og udgang på samme note?
Hvis ikke, så skulle du kunne gøre det forholdsvis simpelt:
Select (Sum(Indgange) - Sum(Udgange)) as GæsterNu, Sum(Indgange) as GæsterIAlt from Gaester where [Date] >= cast(floor(cast(getdate() as float)) as datetime) and Note in(1,2)
Ellers skal du splitte din SQL op i sub-selects, for at sette foreskellige begrænsninger på henholdsvis indgange og udgange. Giv mig en tilbagemelding, så skal jeg nok hjælpe dig hvis du skal bruge sub-selects, men det bliver måske først i morgen.
Du har tilfældigvis ikke forstand på at lave en eller anden form for grafisk brugerinterface til brugerne således at de kan se tallet på skærmen hele tiden uden at skulle køre den via isqlw?
Jeg tænker på at programmet skal kunne køre på flere PC'er og så koble sig op til databasen via en ODBC og/eller en IP adresse? Gerne med automatisk opdatering eller alternativt en knap til opdatering...
Du må lige smide svar, jeg vil godt give over de 200 point mere hvis du kan hjælpe med det grafiske...
Mit første bud ville være at lave en lille .net applikation, enten vb.net, C#, eller eventuelt også en lille web-applikation i f.eks. asp.net/asp.
Alternativt kan man nok også lave noget i Access/Excel/Word, men disse applikationer trækker nok mere hukommelse ud af pc'eren, hvis du kun ønsker en simpel applikation som skal vise antal gæster.
Applikationsudvikling er ikke min stærke side, desværre.
Det skulle ikke være så besværelig. Du skal lave en ODBC/Ole DB forbindelse til databasen, og så skal der være en timer som sørger for at den lillle programstump som henter data, køres i intervaller af f.eks. hvert 10. sekund, eller hvad du nu synes er passende.
Måske kunne man også gøre brug af en trigger på databasen, som giver din applikation besked, når der er kommet nye data.
Dette ligger lidt udenfor mit område, og vil kræve for meget tid, hvis jeg skal finde en løsning. Jeg vil derfro foreslå at du oprætter et nyt spørgsmål i en relevant gruppe, som kan hjælpe dig med applikationsdelen.
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.