2016-07-04 3 views
2

Bitte helfen Sie mir, die Abfrage zu korrigieren. Hier identifiziert sich der Alias ​​"StartDate" nicht.SQL Alias ​​nicht identifizieren

SELECT TOP 1 a.[ID]       
    ,b.[Name] 
    ,a.[VName] 
    ,a.[StartKM] 
    ,a.[RecurringKM] 
    ,dateadd (day,-(120000 - a.[StartKM])/80,GETDATE())as startDate 
    ,dateadd(day,(a.[RecurringKM]/80),[startDate])as [DueDate] 
FROM MaintenanceEventInstance AS a 
INNER JOIN MaintenanceEventDescriptor AS b ON a.ID=b.ID 
WHERE a.VName='test' AND a.CompletedDate IS NULL AND 
    a.ReType='4' 
order by [DueDate] asc 

Jede Hilfe wäre willkommen.

+0

Sie können kein Alias ​​in einem sekundären Parameter in auswählen – Jens

+0

oh! okay danke. Ich werde es anders versuchen. –

+1

Verwenden Sie eine CTE oder abgeleitete Abfrage. Andernfalls wird der vollständige Ausdruck in der DueDate-Berechnung verwendet. – Squirrel

Antwort

1

Sie können nicht Spalte Alias ​​in derselben Auswahl verwenden, anstatt den Ausdruck dort hinzufügen,

SELECT TOP 1 a.[ID] 
      ,b.[Name] 
      ,a.[VName] 
      ,a.[StartKM] 
      ,a.[RecurringKM] 
      ,dateadd (day,-(120000 - a.[StartKM])/80,GETDATE())as startDate 
      ,dateadd(day,(a.[RecurringKM]/80),dateadd (day,-(120000 - a.[StartKM])/80,GETDATE()))as [DueDate] 
FROM MaintenanceEventInstance AS a 
INNER JOIN MaintenanceEventDescriptor AS b ON a.ID=b.ID 
WHERE a.VName='test' AND a.CompletedDate IS NULL AND 
    a.ReType='4' order by [DueDate] as 
2

Sie können den Alias ​​in der SELECT-Klausel verwenden. Versuchen Sie dies stattdessen:

SELECT TOP 1 a.[ID] 
      ,b.[Name] 
      ,a.[VName] 
      ,a.[StartKM] 
      ,a.[RecurringKM] 
      ,x.startDate 
      ,dateadd(day,(a.[RecurringKM]/80),x.[startDate])as [DueDate] 
FROM MaintenanceEventInstance AS a 
INNER JOIN MaintenanceEventDescriptor AS b ON a.ID=b.ID 
CROSS APPLY (SELECT dateadd (day,-(120000 - a.[StartKM])/80,GETDATE())) AS x(startDate) 
WHERE a.VName='test' AND a.CompletedDate IS NULL AND 
     a.ReType='4' order by [DueDate] asc