2017-09-28 1 views
0

Weiß jemand, ob es eine Möglichkeit gibt, die in this question verwendete Methode der Verwendung des Alias ​​einer Unterabfrage zu replizieren, um Berechnungen für ein anderes Feld in t-SQL durchzuführen?Verwendung eines Alias ​​in einer Berechnung für ein anderes Feld

ich die gleiche Syntax für die folgende Abfrage in MS SQL Express versucht, mit und bekam den Fehler unten:

DECLARE @PracticeID INT 
DECLARE @Date1 date 
DECLARE @Date2 date 

SET @PracticeID = 11015 
SET @Date1 = '2017-06-01' 
SET @Date2 = '2017-09-01' 

SELECT prtc.PracticeName ,COUNT(CASE WHEN udi.DevicePlatform = 'iOS' THEN 1 ELSE NULL END) iOSLogins, 
      COUNT(CASE WHEN udi.DevicePlatform = 'Android' THEN 1 ELSE NULL END) AndroidLogins, 
      (SELECT COUNT(*) 
      FROM UserEvent UE 
      WHERE UE.EventTypeID = 1 AND 
        UE.PracticeID = au.PracticeID AND 
        (UE.EventDate BETWEEN @Date1 and @Date2) 
     ) TotalNumberLogins, 
      (SELECT TotalNumberofLogins) - ((SELECT iOSLogins) + (SELECT AndroidLogins)) DesktopLogins 
    FROM UserDeviceInfo UDI JOIN 
     AppUser AU ON udi.UserID = au.UserID JOIN 
     Practice PRTC ON au.PracticeID = prtc.PracticeID 
    WHERE au.PracticeID = @PracticeID AND 
      (udi.Created BETWEEN @Date1 AND @Date2) 
    GROUP BY prtc.PracticeName, au.PracticeID 

Msg 207, Ebene 16, Status 1, Zeile 17 Ungültiger Spaltenname ‚TotalNumberofLogins ". Meldung 207, Ebene 16, Status 1, Zeile 17 ungültig Spaltenname 'iOSLogins'. Nachricht 207, Ebene 16, Status 1, Zeile 17 ungültig Spaltenname "AndroidLogins".

Nicht, dass es einen Unterschied machen würde, aber ich habe versucht, die Alias ​​in Anführungszeichen und Klammern ohne Erfolg zu setzen.

Ich schaffte es, das gewünschte Ergebnis von einer anderen Methode zu erhalten, indem ich die Berechnungen mit den gleichen Werten wie Variablen statt Alias ​​und dann Einfügen in eine Tabelle durchführte.

Diese Abfrage ist jedoch ausführlich, und ich würde gerne wissen, ob es eine Möglichkeit gibt, das Verhalten in der referenzierten Frage für die zukünftige Verwendung zu replizieren.

Vielen Dank für Ihre Hilfe.

Antwort

0

Diese Methode funktioniert nicht in SQL Server. Sie können die gleiche Sache in ein paar verschiedene Arten erreichen:

1.) für jede Spalte aliased den Code anstelle des Alias:

(SELECT COUNT(*) 
FROM UserEvent UE 
WHERE UE.EventTypeID = 1 
AND UE.PracticeID = au.PracticeID 
AND (UE.EventDate BETWEEN @Date1 and @Date2) 
- COUNT(CASE WHEN udi.DevicePlatform = 'iOS' THEN 1 ELSE NULL END) 
+ COUNT(CASE WHEN udi.DevicePlatform = 'Android' THEN 1 ELSE NULL END) Desktop Logics 

2.) Verwenden Sie eine abgeleitete Tabelle die Spalten zu machen, dann können Sie sie durch alias Referenz:

SELECT PracticeName, iOSLogins, AndroidLogins, TotalNumberLogins, 
     (TotalNumberofLogins - (iOSLogins + AndroidLogins)) DesktopLogins 
FROM (
     SELECT prtc.PracticeName, 
       COUNT(CASE WHEN udi.DevicePlatform = 'iOS' THEN 1 ELSE NULL END) iOSLogins, 
       COUNT(CASE WHEN udi.DevicePlatform = 'Android' THEN 1 ELSE NULL END) AndroidLogins, 
      (SELECT COUNT(*) 
       FROM UserEvent UE 
       WHERE UE.EventTypeID = 1 
       AND UE.PracticeID = au.PracticeID 
       AND (UE.EventDate BETWEEN @Date1 and @Date2) 
      ) TotalNumberLogins, 
     FROM UserDeviceInfo UDI 
     JOIN AppUser AU ON udi.UserID = au.UserID 
     JOIN Practice PRTC ON au.PracticeID = prtc.PracticeID 
     WHERE au.PracticeID = @PracticeID 
     AND (udi.Created BETWEEN @Date1 AND @Date2) 
     GROUP BY prtc.PracticeName, au.PracticeID 
    ) a --table alias 

Edit: Tabelle alias erklärt

In einer einfachen Abfrage:

SELECT col1 FROM Table 

Sie kennen die Tabellenreferenz für col1Table ist. (Table.Col1) Sie müssen es nicht schreiben, wenn es das einzige col1 ist, aber Sie wissen immer noch die Tabelle, auf die es verweist.

In einem einfachen abgeleiteten Tabelle:

SELECT col1 FROM (SELECT col1 FROM Table) 

Die Tabellenreferenz für die Spalte inneren noch Table, aber was die äußere? In diesem Fall ist alles innerhalb der Klammern Ihre Tabelle, aber im obigen Beispiel ist diese Tabelle unbenannt. SQL Server erfordert, dass Sie Name/Alias ​​der Tabelle, die Sie erstellt haben, so dass Sie es verweisen können:

SELECT col1 FROM (SELECT col1 FROM Table) MyDerivedTable 

...und jetzt haben Sie eine Tabelle Referenz für Ihre äußere Säule:

SELECT MyDerivedTable.col1 FROM (SELECT col1 FROM Table) MyDerivedTable 

Sie können auch einen größeren Bedarf an diesen Punkt nochmals Tabellen sehen sind beteiligt: ​​

SELECT MyDerivedTable.col1 
FROM (SELECT col1 FROM Table) MyDerivedTable 
JOIN Table T on T.col1 = MyDerivedTable.col1 
+0

Ihr zweiter Vorschlag war genau die Art von Antwort, die ich war auf der Suche nach. Danke Aaron, du warst eine enorme Hilfe. Als eine Nebenbemerkung, warum schlägt die Abfrage fehl, wenn ich den Tabellenalias "a" entferne? –

+0

@ W.Harr Glücklich zu helfen. Ich fügte meiner Antwort eine Erklärung des Alias ​​hinzu, es war zu lang, um als Kommentar zu schreiben. Die kurze Antwort lautet, dass Sie eine Pseudo-Tabelle aus Ihrer Ergebnismenge erstellen, und SQL Server erfordert, dass Sie Ihre Tabelle benennen, damit Sie sie referenzieren können. –

+0

danke für die Erklärung so gründlich –

Verwandte Themen