Toon posts:

[SQL] Sql Server where condition werkt niet

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb de volgende query en selecteer op accountID in de subquery. In dit geval werkt het echter niet. Als ik de accountID condition in de hoofd query plaats werkt het echter wel prima. Ik snap alleen niet waarom dit in het eerste voorbeeld niet werkt. Heeft één van de twee methoden nog de voorkeur?

SQL:
1
2
3
4
5
6
7
8
                SELECT TOP (@number) TicketDate, Balance FROM Data 
                    WHERE Ticket IN 
                         (SELECT MAX(Ticket) FROM Data 
                         WHERE Balance IS NOT NULL
                         AND AccountID = @accountID
                         AND TicketDate > @start AND TicketDate < @end                         
                         GROUP BY DATEPART(week, TicketDate), DATEPART(year, TicketDate))
                    ORDER BY TicketDate DESC


SQL:
1
2
3
4
5
6
7
8
                SELECT TOP (@number) TicketDate, Balance FROM Data 
                    WHERE Ticket IN 
                         (SELECT MAX(Ticket) FROM Data 
                         WHERE Balance IS NOT NULL
                         AND TicketDate > @start AND TicketDate < @end                         
                         GROUP BY DATEPART(week, TicketDate), DATEPART(year, TicketDate))
                    AND AccountID = @accountID                 
                    ORDER BY TicketDate DESC

  • MMUilwijk
  • Registratie: Oktober 2001
  • Laatst online: 05:59
Heeft volgens mij te maken met het feit dat je

SQL:
1
2
3
4
5
(SELECT MAX(Ticket) FROM Data  
                         WHERE Balance IS NOT NULL 
                         AND AccountID = @accountID 
                         AND TicketDate > @start AND TicketDate < @end                          
                         GROUP BY DATEPART(week, TicketDate), DATEPART(year, TicketDate))


Het accountID field meeneemt in je WHERE gedeelte, maar noch in je SELECT binnen een aggregate functie, noch in je GROUP BY opneemt. Meen mij te herinneren dat SQL Server (welke versie?) dan ook wel een fout aangeeft.

Probeer AccountID eens onderdeel te maken van je GROUP BY?

Everytime I suffer I become a better man because of it


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:26
MMUilwijk schreef op zaterdag 07 juni 2008 @ 13:12:

Het accountID field meeneemt in je WHERE gedeelte, maar noch in je SELECT binnen een aggregate functie, noch in je GROUP BY opneemt.
Dat hoeft helemaal niet ? :?
Je kan perfect filteren in je WHERE op een veld dat niet in je SELECT list staat.

Als je gebruik maakt van aggregate functies (zoals hier), moet je wel ieder ander veld dat in je select lijst staat, opnemen in de group by, maar da's hier wel het geval.
Probeer AccountID eens onderdeel te maken van je GROUP BY?
Dan ga je andere resultaten krijgen ...
Dan zal er nl. ook gegroepeerd worden op AccountID & datum, en zal daarvan iedere keer het max(ticket) weergegeven worden.
Hmm, nu, opzich zou dit in dit geval niet veel uitmaken, aangezien je blijkbaar toch maar de gegevens wilt van één accountid.

Wat is het resultaat eigenlijk van beide subqueries ? Wat geven die terug ?

[ Voor 14% gewijzigd door whoami op 07-06-2008 13:34 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
De query heeft al doel om voor elke week de laatste TicketDate & Balance op te halen. Als test heb ik in mijn database twee accounts aangemaakt, die precies dezelfde data bevatten (elke transaction row staat dus dubbel in de database, maar dan met een andere AccountID waarde).

De tweede query werkt zoals verwacht, ik krijg netjes één keer voor elke week de laatste TicketDate & Balance terug. De eerste query werkt niet zoals verwacht, ik krijg voor elke week twee keer de laatste TicketDate & Balance terug. Als ik maar één account in mijn database heb (dus elke transaction row staat maar één keer in de database), dan werkt de eerste query ook goed. Volgens mij kan het niet anders dat de AccountID filter in de eerste query niet goed wordt toegepast.

Verwijderd

Topicstarter
kick

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 25-10 14:28
Zoals je zegt staat alles er dubbel in, alleen een ander account id. Het ticket komt dus twee keer voor.

In de eerste query krijg je van de subquery 1 ticket terug. Daarna zoek je in de hoofdquery alle tickets (van alle account ids) die dat ticket hebben, dat zijn er dus 2.

Verwijderd

Topicstarter
_js_ schreef op maandag 09 juni 2008 @ 01:09:
Zoals je zegt staat alles er dubbel in, alleen een ander account id. Het ticket komt dus twee keer voor.

In de eerste query krijg je van de subquery 1 ticket terug. Daarna zoek je in de hoofdquery alle tickets (van alle account ids) die dat ticket hebben, dat zijn er dus 2.
Bedankt, een beetje stom dat ik daar overheen heb gekeken.
Pagina: 1