2016-05-02 8 views
-2

Wir haben die folgende Abfrage in einem unsere gespeicherten Prozeduren ausgeführt wird:mehrere where-Klauseln mit derselben Spalte in SQL Server

SELECT 
    WOffice AS office, 
    RIGHT(JobTitle,4) JOBTITLE, 
    SUM(ISNULL(rHours,0)) AS rcount, 
    SUM(ISNULL(rdollars,0)) + SUM(ISNULL(amount,0)) AS rdollars, 
    CAST (DATEADD(wk,DATEDIFF(wk,0,paydate),-1)AS DATE)AS [week] 
FROM 
    [dbo].[warehouse] 
WHERE 
    paydate BETWEEN paydate AND DATEADD(DAY, 7, paydate) 
    AND (paydate BETWEEN @WkStart AND @EzMaxDate) 
    AND (PayDate BETWEEN @Seasonstart AND @SeasonEnd) 
    AND SUBSTRING(JobTitle,1,1) LIKE '%[A-Z]%' 
GROUP BY 
    WOffice, RIGHT(JobTitle, 4), DATEADD(wk, DATEDIFF(wk, 0, paydate), -1) 

In diesem Code ist die paydate Spalte in mehrere verwendeten Klauseln wo. Gibt es eine effizientere Möglichkeit, die obige Logik in SQL zu schreiben?

+0

'paydate zwischen paydate und DATEADD (Tag, 7, paydate)', was versuchst du hier zu machen? Es ist im Grunde das gleiche wie 'paydate <= DATEADD (Tag, 7, paydate)' – sagi

+0

Allgemeine GROUP BY-Regel: "Wenn eine GROUP BY-Klausel angegeben ist, muss jede Spaltenreferenz in der SELECT-Liste entweder eine Gruppierungsspalte identifizieren oder das Argument sein einer eingestellten Funktion. " – jarlh

+0

@sagi Ich gruppiere die Tabellendaten tatsächlich wöchentlich. – bmsqldev

Antwort

1

Die Logik für paydate ist in Ordnung. Wenn SQL Server LEAST() und GREATEST() unterstützt, können Sie möglicherweise andere elegante Lösungen finden.

Die Behandlung mehrerer überlappender Zeiträume ist schwierig. Ich kann nicht sagen, dass Ihre Logik korrekt ist. Aber wenn Sie beabsichtigen, die Überschneidung für die verschiedenen Zeiträume zu erreichen, dann ist es richtig.

Als eine Anmerkung ist die Logik für JOBTITLE Overkill. Entweder:

JobTitle LIKE '[A-Z]%' 

oder:

LEFT(JobTitle, 1) BETWEEN 'A' and 'Z' 

ziehe ich den ersten Ansatz, auch da begann ich wieder zu mögen LIKE.

+0

Ich habe die Logik für die Überprüfung mehrerer Datum Validierungen paydate verwendet. – bmsqldev

Verwandte Themen