如何在另一个字段的计算中使用别名

时间:2017-09-28 15:06:18

标签: tsql subquery

有没有人知道是否有办法复制this question中使用的方法,使用子查询的别名来对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&#39 ;.消息207,级别16,状态1,行17无效   列名称' iOSLogins'。消息207,级别16,状态1,行17无效   列名称' AndroidLogins'。

并不是说它会有所作为,但我确实尝试将别名放在引号和括号中无济于事。

我确实设法通过使用与变量相同的值而不是别名来执行计算,然后将它们插入表中,从另一个方法获得所需的结果。

然而,该查询是详细的,我想知道是否有任何方法可以复制引用问题中的行为以供将来使用。

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:2)

该方法在SQL Server中不起作用。您可以通过几种不同的方式完成同样的事情:

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