Avatar billede lanthernen Nybegynder
06. februar 2007 - 11:56 Der 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.

Håber det er forståeligt…
Avatar billede ramad Praktikant
06. februar 2007 - 12:15 #1
Såfremt at det er int felter du bruger i ind og udgang - og at du markerer med et 1-tal for hver bevægelse, så kan det klares på følgende metode.

Gæster ialt:
SELECT COUNT(indgang) FROM GAESTER

Gæster nu:
SELECT (COUNT(indgang) - COUNT(udgang)) AS Gaester_NU FROM GAESTER
Avatar billede lorentsnv Nybegynder
06. februar 2007 - 12:16 #2
Hvis jeg forstår dig rigtig, vil antal gæster lige nu være alle gæster, som ikke har en værdi i feltet udgang:

select GæsterNu = Count(Indgang)
from Gaester
where Udgang is null

Antal gæster for i dag, vil være antal gæster nu, + alle gester som har checket ud i dag:

Select GæsterUdIDag = Count(Udgang)
from Gaester
where Udgang >= select cast(floor(cast(getdate() as float)) as datetime)

Forstår jeg dig rigtig?
Avatar billede lorentsnv Nybegynder
06. februar 2007 - 12:21 #3
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)
)
Avatar billede lanthernen Nybegynder
06. februar 2007 - 13:05 #4
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
Avatar billede lorentsnv Nybegynder
06. februar 2007 - 13:15 #5
Ved du hvordan tallene skal læses.
Kl 11:00 var der 23 i andgang og 13 i udgang. Hvor mange gæster var det i alt kl. 11.00?
Avatar billede lanthernen Nybegynder
06. februar 2007 - 13:18 #6
KL 11.00 er der 23 gæster der er gået ind
KL 11.15 er der yderligere 17 gæster der er gået ind

Det vil sige lige nu er der 40 inde minus dem der er gået ud
Avatar billede lorentsnv Nybegynder
06. februar 2007 - 13:23 #7
Dvs. at kl. 11:00 vil det være:
Gæster nu: 23
Gæster i alt: 40

Men det kan vel ikke helt passe med at kl. 11:30 skulle vi så få:
Gæster nu: 10
Gæster i alt: 25

Er det noget jeg har misforstået?
Avatar billede lanthernen Nybegynder
06. februar 2007 - 13:28 #8
Hvis du kigger på:
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

er status kl 11.30 følgende:
Gæster nu: 12 ((23+17+10)-13-10-15)
Gæster ialt: 50 (23+17+10)
Avatar billede lorentsnv Nybegynder
06. februar 2007 - 13:40 #9
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)
Avatar billede lanthernen Nybegynder
06. februar 2007 - 13:48 #10
Ok...

Jeg får en fejl:
Incorrect syntax near the keyword 'select'

Nårjeg dobbeltklikker på fejlen bliver den sidste linje markeret:
where Udgang >= select cast(floor(cast(getdate() as float)) as datetime)
Avatar billede lorentsnv Nybegynder
06. februar 2007 - 13:55 #11
Unskyld, dr skulle ikke være den sidste select:

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)
Avatar billede lorentsnv Nybegynder
06. februar 2007 - 14:03 #12
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)
Avatar billede lanthernen Nybegynder
06. februar 2007 - 14:05 #13
når jeg skyder den af får jeg:
GæsterNu    GæsterIAlt
NULL        NULL

til trods for der er masser af gæster...
Avatar billede lorentsnv Nybegynder
06. februar 2007 - 14:14 #14
Vil du checke at du får alle dagens bevægelser med denne sql:

Select Dato, Indgang, Udgang
from Gaester
where Dato >= cast(floor(cast(getdate() as float)) as datetime)

Hvis du ikke får nogen records med denne sql, kan der være et problem med datofeltet.

Cehck eventuelt at du får dagens dato, med klokken sat til 00:00:00, med følgende SQL:

Select cast(floor(cast(getdate() as float)) as datetime)
Avatar billede lorentsnv Nybegynder
06. februar 2007 - 15:02 #15
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)
Avatar billede lanthernen Nybegynder
06. februar 2007 - 16:05 #16
Hejsa

Når jeg kun bruger:
Select cast(floor(cast(getdate() as float)) as datetime)
får jeg:
2007-02-06 00:00:00.000
Avatar billede lanthernen Nybegynder
06. februar 2007 - 16:07 #17
Når jeg kører:

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'.
Avatar billede lanthernen Nybegynder
06. februar 2007 - 16:08 #18
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'.
Avatar billede lorentsnv Nybegynder
06. februar 2007 - 16:11 #19
Fejlmedelelsen indikerer at der ikke er noget felt i tabellen Geaster som heder Dato.
Avatar billede lanthernen Nybegynder
06. februar 2007 - 16:13 #20
kan se at dato selvfølgelig ikke hedder dato men date...
sorry
Avatar billede lorentsnv Nybegynder
06. februar 2007 - 16:17 #21
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)
Avatar billede lanthernen Nybegynder
06. februar 2007 - 16:41 #22
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 flettes ind?
Smider gerne flere point...
Avatar billede lorentsnv Nybegynder
06. februar 2007 - 17:23 #23
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.
Avatar billede lanthernen Nybegynder
07. februar 2007 - 08:26 #24
Det ser ud til at det virker!
Tak for det!

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...

Takker indtil nu...
Avatar billede lorentsnv Nybegynder
07. februar 2007 - 09:11 #25
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.

Hvad har du af erfaringer med programmering?
Avatar billede lanthernen Nybegynder
07. februar 2007 - 09:15 #26
Ikke ret meget - har haft lidt og kan godt finde ud af lidt men kan ikke lave en app. som denne...
Avatar billede lanthernen Nybegynder
07. februar 2007 - 09:16 #27
Men skal helst være uden der skal bruges en compiler som jeg har hørt noget prog kræver
Avatar billede lorentsnv Nybegynder
07. februar 2007 - 20:20 #28
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.
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
Computerworld tilbyder specialiserede kurser i database-management

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