Sql server T-SQL上的语法错误,具有组、独立和具有

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'; …但我得到了一个错误:“每

我有一个带有日期和员工编号的登录表。我需要的是统计从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
    中不可用