Sql server T-SQL上的语法错误,具有组、独立和具有
我有一个带有日期和员工编号的登录表。我需要的是统计从2014年开始,每个月和每年有多少独特的员工登录 这是我所能做到的:Sql server T-SQL上的语法错误,具有组、独立和具有,sql-server,tsql,group-by,Sql Server,Tsql,Group By,我有一个带有日期和员工编号的登录表。我需要的是统计从2014年开始,每个月和每年有多少独特的员工登录 这是我所能做到的: SELECT YEAR(Date) AS 'Year', MONTH(Date) AS 'Month', COUNT(DISTINCT EmpID) AS EmpCount FROM [Logins].[dbo].[tblPortalLog] GROUP BY 'Year', 'Month' having 'Year' >= '2014'; …但我得到了一个错误:“每
SELECT YEAR(Date) AS 'Year', MONTH(Date) AS 'Month', COUNT(DISTINCT EmpID) AS EmpCount
FROM [Logins].[dbo].[tblPortalLog]
GROUP BY 'Year', 'Month'
having 'Year' >= '2014';
…但我得到了一个错误:“每个GROUPBY表达式必须至少包含一个非外部引用的列。”
我在谷歌上搜索了这个错误,但我仍然无法找到如何更改SQL,以便得到我想要的结果。您应该在别名周围使用双引号或[],而不是单引号(编辑:在having子句中)。单引号表示字符串值。此外,为了便于移植,您可能应该在group by中使用实际表达式而不是别名
SELECT YEAR(Date) AS [Year], MONTH(Date) AS [Month], COUNT(DISTINCT EmpID) AS EmpCount
FROM [Logins].[dbo].[tblPortalLog]
GROUP BY YEAR(Date), MONTH(Date)
HAVING YEAR(Date) >= '2014'
另外,正如另一个答案中所指出的,您的条件可能应该在WHERE
子句中,而不是have
。此外,比较原始日期很可能更快
SELECT YEAR(Date) AS [Year], MONTH(Date) AS [Month], COUNT(DISTINCT EmpID) AS EmpCount
FROM [Logins].[dbo].[tblPortalLog]
WHERE Date >= '20140101'
GROUP BY YEAR(Date), MONTH(Date)
您应该在别名周围使用双引号或[],而不是单引号(having子句中的edit:)。单引号表示字符串值。此外,为了便于移植,您可能应该在group by中使用实际表达式而不是别名
SELECT YEAR(Date) AS [Year], MONTH(Date) AS [Month], COUNT(DISTINCT EmpID) AS EmpCount
FROM [Logins].[dbo].[tblPortalLog]
GROUP BY YEAR(Date), MONTH(Date)
HAVING YEAR(Date) >= '2014'
另外,正如另一个答案中所指出的,您的条件可能应该在WHERE
子句中,而不是have
。此外,比较原始日期很可能更快
SELECT YEAR(Date) AS [Year], MONTH(Date) AS [Month], COUNT(DISTINCT EmpID) AS EmpCount
FROM [Logins].[dbo].[tblPortalLog]
WHERE Date >= '20140101'
GROUP BY YEAR(Date), MONTH(Date)
您应该在别名周围使用双引号或[],而不是单引号(having子句中的edit:)。单引号表示字符串值。此外,为了便于移植,您可能应该在group by中使用实际表达式而不是别名
SELECT YEAR(Date) AS [Year], MONTH(Date) AS [Month], COUNT(DISTINCT EmpID) AS EmpCount
FROM [Logins].[dbo].[tblPortalLog]
GROUP BY YEAR(Date), MONTH(Date)
HAVING YEAR(Date) >= '2014'
另外,正如另一个答案中所指出的,您的条件可能应该在WHERE
子句中,而不是have
。此外,比较原始日期很可能更快
SELECT YEAR(Date) AS [Year], MONTH(Date) AS [Month], COUNT(DISTINCT EmpID) AS EmpCount
FROM [Logins].[dbo].[tblPortalLog]
WHERE Date >= '20140101'
GROUP BY YEAR(Date), MONTH(Date)
您应该在别名周围使用双引号或[],而不是单引号(having子句中的edit:)。单引号表示字符串值。此外,为了便于移植,您可能应该在group by中使用实际表达式而不是别名
SELECT YEAR(Date) AS [Year], MONTH(Date) AS [Month], COUNT(DISTINCT EmpID) AS EmpCount
FROM [Logins].[dbo].[tblPortalLog]
GROUP BY YEAR(Date), MONTH(Date)
HAVING YEAR(Date) >= '2014'
另外,正如另一个答案中所指出的,您的条件可能应该在WHERE
子句中,而不是have
。此外,比较原始日期很可能更快
SELECT YEAR(Date) AS [Year], MONTH(Date) AS [Month], COUNT(DISTINCT EmpID) AS EmpCount
FROM [Logins].[dbo].[tblPortalLog]
WHERE Date >= '20140101'
GROUP BY YEAR(Date), MONTH(Date)
首先,使用“where子句”仅处理所需的数据。然后,在使用“GROUPBY子句”时,不能引用“select子句”中出现的列别名。你必须重复这个公式。在这种情况下,公式为“年(日期)” 注意:我在date周围加了方括号,因为它是一个保留的世界。首先,使用“where子句”只处理您需要的数据。
然后,在使用“GROUPBY子句”时,不能引用“select子句”中出现的列别名。你必须重复这个公式。在这种情况下,公式为“年(日期)” 注意:我在date周围加了方括号,因为它是一个保留的世界。首先,使用“where子句”只处理您需要的数据。
然后,在使用“GROUPBY子句”时,不能引用“select子句”中出现的列别名。你必须重复这个公式。在这种情况下,公式为“年(日期)” 注意:我在date周围加了方括号,因为它是一个保留的世界。首先,使用“where子句”只处理您需要的数据。
然后,在使用“GROUPBY子句”时,不能引用“select子句”中出现的列别名。你必须重复这个公式。在这种情况下,公式为“年(日期)”
注意:我在日期周围加了方括号,因为它是一个保留的世界。首先,您的查询是不正确的 您不是按
年(日期)
和月(日期)
进行分组,而是按字符串'YEAR'
和'MONTH'
进行分组。这就是你犯错误的原因。你怎么修理它
很简单。这是正确的查询:
SELECT YEAR(Date) AS [Year], MONTH(Date) AS [Month], COUNT(DISTINCT [EmpID]) AS [EmpCount]
FROM [Logins].[dbo].[tblPortalLog]
GROUP BY YEAR(Date), MONTH(Date)
HAVING YEAR(Date) >= '2014';
如果您想稍微美化它并使别名可用,可以使用交叉应用
来实现这一点:
SELECT T.[Year], T.[Month], COUNT(DISTINCT [EmpID]) AS [EmpCount]
FROM [Logins].[dbo].[tblPortalLog]
CROSS APPLY (
SELECT YEAR(Date) AS [Year], MONTH(Date) AS [Month]
) AS T
GROUP BY T.[Year], T.[Month]
HAVING T.[Year] >= '2014';
在GROUP BY
和HAVING
子句中不能使用别名的原因是自然查询处理顺序,即:
FROM
开启
OUTER
其中
分组依据
多维数据集
|汇总
具有
选择
DISTINCT
订购人
TOP
您可以看到,
SELECT
位于groupby
之后,您正在SELECT
语句中创建别名,因此在groupby
中无法使用这些别名。首先,您的查询是不正确的
您不是按年(日期)
和月(日期)
进行分组,而是按字符串'YEAR'
和'MONTH'
进行分组。这就是你犯错误的原因。你怎么修理它
很简单。这是正确的查询:
SELECT YEAR(Date) AS [Year], MONTH(Date) AS [Month], COUNT(DISTINCT [EmpID]) AS [EmpCount]
FROM [Logins].[dbo].[tblPortalLog]
GROUP BY YEAR(Date), MONTH(Date)
HAVING YEAR(Date) >= '2014';
如果您想稍微美化它并使别名可用,可以使用交叉应用
来实现这一点:
SELECT T.[Year], T.[Month], COUNT(DISTINCT [EmpID]) AS [EmpCount]
FROM [Logins].[dbo].[tblPortalLog]
CROSS APPLY (
SELECT YEAR(Date) AS [Year], MONTH(Date) AS [Month]
) AS T
GROUP BY T.[Year], T.[Month]
HAVING T.[Year] >= '2014';
在GROUP BY
和HAVING
子句中不能使用别名的原因是自然查询处理顺序,即:
FROM
开启
OUTER
其中
分组依据
多维数据集
|汇总
具有
选择
DISTINCT
订购人
TOP
SELECT
位于groupby
之后,您正在SELECT
语句中创建别名,从而使它们在groupby
中不可用