Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[MS SQL] 0 teruggeven bij lege waarde

Pagina: 1
Acties:

  • awenger
  • Registratie: Februari 2006
  • Laatst online: 05-11 02:32
Ik ben momenteel bezig voor een ASP.NET applicatie een statistieken overzicht te schrijven.
Tijdens het gebruik van de applicatie wordt op meerdere momenten data weggeschreven naar een database.

Momenteel probeer ik een Stored Procedure te schrijven waarmee het aantal hits per dag worden opgehaald uit de databases. Dat heb ik gedaan met de informatie uit dit topic: http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=85285

Het lukt me om netjes per dag het aantal bezoekers op te halen, maar op dagen zonder bezoekers zou ik graag ook hebben dat SQL een 0 teruggeeft. Ik gebruik de gegevens namelijk om een grafiek te plotten. Is het mogelijk om SQL een 0 terug te laten geven?

  • whoami
  • Registratie: December 2000
  • Laatst online: 12:59
Ja, dat is mogelijk ....
Maar hoe .... dat hangt af van hoe jouw oplossing er nu eigenlijk uit ziet ... Aangezien ik vermoed dat je met 'COUNT' aan de slag gaat, zal een simpele 'ISNULL' geen soelaas bieden. :)

Kortom: meer info.

Verder heeft dit niets met development tools te maken, maar wel met programmeren.
-> PRG dus.

https://fgheysels.github.io/


  • remco_k
  • Registratie: April 2002
  • Laatst online: 12:27

remco_k

een cassettebandje was genoeg

Post even de query die dat werk voor je doet, want zonder dat kunnen we je niet bepaald helpen.
Verder zien we dan ook graag wat je al hebt geprobeerd om het voor elkaar te krijgen.

Alles kan stuk.


  • awenger
  • Registratie: Februari 2006
  • Laatst online: 05-11 02:32
De exacte query heb ik momenteel niet bij de hand (andere machine) en zal ik morgen even plaatsen. Het is een gemodificeerde versie van:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Declare @MinDate DateTime
Declare @MaxDate DateTime
Select @MinDate = Min(FromDate) From aBookings
Select @MaxDate = Max(ToDate)   From aBookings

SELECT d.[DATE], Count(b.BookingID)
-- F_TABLE_DATE is from http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=61519&SearchTerms=F_TABLE_DATE
FROM   F_TABLE_DATE(@MinDate, @MaxDate) d 
INNER JOIN aBookings b
ON    d.[DATE] BETWEEN b.FromDate AND b.ToDate
WHERE SiteID = 26 
GROUP BY d.[DATE]
Having Count(b.BookingID) <> 0


Ik werk inderdaad met een Count. Ik heb er ook aan gedacht om met een While lus te werken om door de verschillende dagen heen te lopen. Heel veel meer heb ik nog niet gedaan. Mede omdat ik niet weet waarop ik zou moeten zoeken om iets dergelijks voor elkaar te krijgen. (Beginnend programmeur)

  • whoami
  • Registratie: December 2000
  • Laatst online: 12:59
LEFT JOIN gebruiken ipv een INNER JOIN zal er al voor zorgen dat je alle 'Dates' te zien krijgt, ook als er geen gerelateerde records in aBookings zitten voor die datum. (Check de PRG FAQ mbt JOIN's).

Je moet mij echter ook eens uitleggen waarom je in je join clausule een between gebruikt ?

[ Voor 16% gewijzigd door whoami op 24-09-2008 22:20 ]

https://fgheysels.github.io/


  • awenger
  • Registratie: Februari 2006
  • Laatst online: 05-11 02:32
Ok, ik ben iets verder. Ik krijg inmiddels 0 waardes terug dankzij de tip van Whaomi. Ik heb helaas wel weer een nieuw probleem. Ik gebruik het volgende SQL-statement:

SQL:
1
2
3
4
5
6
7
8
9
10
Declare @MinDate DateTime
Declare @MaxDate DateTime
Set @MinDate = '2008-09-20'
Set @MaxDate = '2008-09-30'

SELECT d.ISO_DATE AS Datum, Count(b.StatBewerkingID) AS Hits
-- F_TABLE_DATE is from http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=61519&SearchTerms=F_TABLE_DATE
FROM F_TABLE_DATE(@MinDate, @MaxDate) d
FULL OUTER JOIN Stat b ON d.ISO_DATE BETWEEN b.DatumTijd-1 AND b.Datumtijd
GROUP BY d.ISO_DATE


Dit geeft me de volgende output:

2008-09-20 0
2008-09-21 0
2008-09-22 0
2008-09-23 4
2008-09-24 13
2008-09-25 2
2008-09-26 0
2008-09-27 0
2008-09-28 0
2008-09-29 0
2008-09-30 0

De lay-out klopt dus. Ik krijg echter de count terug van alle s.StatBewerkingID's. Ik wil echter dat er alleen wordt geteld als s.StatBewerkingID = 1. Als ik dat als WHERE statement toevoeg krijg ik echter weer geen rijen terug met 0en erin:

2008-09-23 2
2008-09-24 13
2008-09-25 2

@whoami: Ik gebruik een BETWEEN statement in mijn JOIN omdat SQL de Dag opslaat als YYYY-MM-DD HH:MM:SS......... en ik wil dit alles op een bepaalde datum wordt meegnomen ongeacht de tijd.

[ Voor 10% gewijzigd door awenger op 25-09-2008 12:35 ]


  • Redshark
  • Registratie: Mei 2002
  • Laatst online: 11:21
Je kunt toch alleen de datum zonder tijd gebruiken hiervoor?

http://dev.mysql.com/doc/...ctions.html#function_date

DATE(expr)

Extracts the date part of the date or datetime expression expr.
code:
1
mysql> SELECT DATE('2003-12-31 01:02:03');

Geeft:
'2003-12-31'

  • awenger
  • Registratie: Februari 2006
  • Laatst online: 05-11 02:32
Redshark schreef op donderdag 25 september 2008 @ 13:09:
Je kunt toch alleen de datum zonder tijd gebruiken hiervoor?

http://dev.mysql.com/doc/...ctions.html#function_date

DATE(expr)

Extracts the date part of the date or datetime expression expr.
code:
1
mysql> SELECT DATE('2003-12-31 01:02:03');

Geeft:
'2003-12-31'
MySQL kent die functie. MSSQL echter niet

  • Redshark
  • Registratie: Mei 2002
  • Laatst online: 11:21
Dacht dat je MySQL gebruikte. Maar met cast en convert moet je er wel volgens mij wel uitkomen mocht je het nodig hebben.

  • jlrensen
  • Registratie: Oktober 2000
  • Laatst online: 22-10 22:35

jlrensen

plaatjes vullen geen gaatjes

awenger schreef op donderdag 25 september 2008 @ 12:20:
Ok, ik ben iets verder. Ik krijg inmiddels 0 waardes terug dankzij de tip van Whaomi. Ik heb helaas wel weer een nieuw probleem. Ik gebruik het volgende SQL-statement:

SQL:
1
2
3
4
5
6
7
8
9
10
Declare @MinDate DateTime
Declare @MaxDate DateTime
Set @MinDate = '2008-09-20'
Set @MaxDate = '2008-09-30'

SELECT d.ISO_DATE AS Datum, Count(b.StatBewerkingID) AS Hits
-- F_TABLE_DATE is from http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=61519&SearchTerms=F_TABLE_DATE
FROM F_TABLE_DATE(@MinDate, @MaxDate) d
FULL OUTER JOIN Stat b ON d.ISO_DATE BETWEEN b.DatumTijd-1 AND b.Datumtijd
GROUP BY d.ISO_DATE


Dit geeft me de volgende output:

2008-09-20 0
2008-09-21 0
2008-09-22 0
2008-09-23 4
2008-09-24 13
2008-09-25 2
2008-09-26 0
2008-09-27 0
2008-09-28 0
2008-09-29 0
2008-09-30 0

De lay-out klopt dus. Ik krijg echter de count terug van alle s.StatBewerkingID's. Ik wil echter dat er alleen wordt geteld als s.StatBewerkingID = 1. Als ik dat als WHERE statement toevoeg krijg ik echter weer geen rijen terug met 0en erin:

2008-09-23 2
2008-09-24 13
2008-09-25 2
Kan je de voorwaarde s.StatBewerkingID = 1. dan niet in je join zetten, dus

SQL:
1
2
3
4
5
SELECT d.ISO_DATE AS Datum, Count(b.StatBewerkingID) AS Hits
FROM F_TABLE_DATE(@MinDate, @MaxDate) d
FULL OUTER JOIN Stat b ON d.ISO_DATE BETWEEN b.DatumTijd-1 AND b.Datumtijd
and b.StatBewerkingID = 1
GROUP BY d.ISO_DATE

Men moet het denken bijbrengen, niet wat al gedacht is. ~C. Gurlitt


  • winkbrace
  • Registratie: Augustus 2008
  • Laatst online: 24-08 15:17
Precies.

Let altijd goed op wat in je WHERE staat als je OUTER JOINs gebruikt :)
Pagina: 1