有没有人知道是否有办法复制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'。
并不是说它会有所作为,但我确实尝试将别名放在引号和括号中无济于事。
我确实设法通过使用与变量相同的值而不是别名来执行计算,然后将它们插入表中,从另一个方法获得所需的结果。
然而,该查询是详细的,我想知道是否有任何方法可以复制引用问题中的行为以供将来使用。
感谢您提供任何帮助。
答案 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