спасибо за столь полное объяснение

ибудь знает, есть ли способ повторить метод, используемый вэтот вопрос использования псевдонима подзапроса для выполнения расчетов в другом поле в t-SQL?

Я попытался использовать тот же синтаксис для следующего запроса в MS SQL Express и получил ошибку ниже:

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

Сообщение 207, Уровень 16, Состояние 1, Строка 17 Неверное имя столбца 'TotalNumberofLogins'. Сообщение 207, уровень 16, состояние 1, строка 17 Неверное имя столбца «iOSLogins». Сообщение 207, уровень 16, состояние 1, строка 17 Неверное имя столбца «AndroidLogins».

Не то чтобы это имело значение, но я попытался поместить псевдонимы в кавычки и скобки безрезультатно.

Мне удалось получить желаемый результат из другого метода, выполнив вычисления, используя те же значения, что и переменные, а не псевдонимы, а затем вставив их в таблицу.

Этот запрос, однако, многословен, и я хотел бы знать, есть ли какой-либо способ повторить поведение в указанном вопросе для будущего использования.

Спасибо за любую помощь, которую вы можете предоставить.

Ответы на вопрос(1)

Решение Вопроса

колькими способами:

1.) Используйте код для каждого столбца с псевдонимами вместо псевдонима:

(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.) Используйте производную таблицу для создания столбцов, затем вы можете ссылаться на них по псевдониму:

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

Изменить: объяснение псевдонима таблицы

В простом запросе:

SELECT col1 FROM Table

Вы знаете ссылку на таблицу дляcol1 являетсяTable, (Table.Col1) Вам не нужно писать это, если это единственныйcol1, но вы все еще знаете таблицу, на которую она ссылается.

В простой производной таблице:

SELECT col1 FROM (SELECT col1 FROM Table)

Ссылка на таблицу длявнутренний колонка ещеTableа как же внешний? В этом случае все, что в скобках - это ваша таблица, но в приведенном выше примере эта таблица не названа. SQL Server требует от имени / псевдонима созданной таблицы, чтобы вы могли ссылаться на нее:

SELECT col1 FROM (SELECT col1 FROM Table) MyDerivedTable

... и теперь у вас есть ссылка на таблицу для внешнего столбца:

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

Вы также можете увидеть большую потребность в этом, как только появятся еще таблицы:

SELECT MyDerivedTable.col1
FROM (SELECT col1 FROM Table) MyDerivedTable
JOIN Table T on T.col1 = MyDerivedTable.col1
 W.Harr28 сент. 2017 г., 18:01
Ваше второе предложение было именно тем ответом, который я искал. Спасибо большое, Аарон, ты мне очень помог. В качестве примечания: почему запрос не выполняется, если я удаляю псевдоним таблицы 'a'?
 Aaron Dietz28 сент. 2017 г., 18:25
@ W.Harr Рад помочь. Я добавил объяснение псевдонима в свой ответ, это было слишком долго, чтобы писать как комментарий. Короткий ответ: вы создаете псевдотаблица из набора результатов, а SQL Server требует, чтобы вы называли свою таблицу, чтобы вы могли ссылаться на нее.
 W.Harr28 сент. 2017 г., 18:43
спасибо за столь полное объяснение

Ваш ответ на вопрос