Sql server 2008 我可以在select语句中使用CAST()吗?

Sql server 2008 我可以在select语句中使用CAST()吗?,sql-server-2008,select,casting,Sql Server 2008,Select,Casting,我试图在SQL语句中使用强制转换,但它不允许我在group by中将CASTmyDateTime、Date视为MyLoginSortDate?我只知道SQL的基础知识,我正在努力学习更多。 五月数据如下所示: select cll.Email,CAST(cll.DateEntered as Date) as LoginDate, COUNT(cll.email) as FailedCount from [GC].[dbo].[

我试图在SQL语句中使用强制转换,但它不允许我在group by中将CASTmyDateTime、Date视为MyLoginSortDate?我只知道SQL的基础知识,我正在努力学习更多。 五月数据如下所示:

       select  cll.Email,CAST(cll.DateEntered as Date) as LoginDate, 
              COUNT(cll.email) as FailedCount
            from [GC].[dbo].[CustomerLoginLog] as cll
            where [CustomerId] is null
            group by LoginDate, cll.Email
            order by FailedCount desc`
CustomerID int,null 电子邮件varchar60 日期输入日期时间

我正在尝试按日期时间的日期部分进行分组,并在电子邮件中分组

我的存储过程选择部分如下所示:

       select  cll.Email,CAST(cll.DateEntered as Date) as LoginDate, 
              COUNT(cll.email) as FailedCount
            from [GC].[dbo].[CustomerLoginLog] as cll
            where [CustomerId] is null
            group by LoginDate, cll.Email
            order by FailedCount desc`
返回的列名“LoginDate”无效

我希望能够看到:

电子邮件、登录、失败计数

xyz@test.com,11/01/12,21

abc@test2.com,11/01/12,17

xyz@test.com,12月10日,30日,15日

等等。我相信这只是初学者的错误。我把这篇文章搞砸了,但我希望有人能理解。select格式在我的计算机上看起来更好。

GROUP BY语句在select语句之前进行计算,因此SQL server不知道您在select语句中为表达式指定的别名。要解决此问题,只需通过以下方式在组中重复表达式:

或者使用CTE包装查询的简单部分,并对CTE结果进行分组:

;WITH MyQuery AS 
(
    SELECT
        cll.Email
        ,CAST(cll.DateEntered AS Date) AS LoginDate
    FROM 
        [GC].[dbo].[CustomerLoginLog] AS cll
    WHERE 
        cll.[CustomerId] IS NULL
)
SELECT 
    Email
    ,LoginDate
    ,COUNT(*) AS FailedCount
FROM 
    MyQuery
GROUP BY 
    LoginDate, Email
ORDER BY 
    FailedCount DESC
或者,您可以在嵌套的SELECT语句中包含CTE as的内容。

SELECT语句在GROUP BY子句之后逻辑执行,因此GROUP BY子句无法看到别名LoginDate。您必须使用某种类型的子查询,或类似的CTE:

SELECT *
FROM
(
   SELECT 
     cll.Email,
     CAST(cll.DateEntered as Date) as LoginDate, 
     COUNT(cll.email) as FailedCount
   FROM [GC].[dbo].[CustomerLoginLog] as cll
   WHERE [CustomerId] IS NULL
) t
GROUP BY LoginDate, cll.Email
ORDER BY FailedCount DESC

我得到的“CustomerLoginLog.Email”在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中。你能推荐一本好书给那些已经完成了基本SQL和更难的工作的人吗?@user1830640:那是我的错。我更新了我的答案以解释我的错误。没有,我想我脑子里没有任何可以推荐的书。检查或亚马逊的高评级SQL书籍!谢谢,你让我走对了路。我将COUNTcll.email作为FailedCount向下移动到MyQuery部分,并将*、COUNTMyQuery.email作为FailedCount放置,效果非常好。从VFP到C.net和SQL Server 2008,这一切都是一件很粗糙的事情@user1830640:只是不要保留MyQuery名称!-将CTE重命名为一些有用的东西,比如CustomerLoginDetail。我在您对Cory回答的评论中看到,您询问了一本将您的T-SQL技能提升到下一个级别的好书。我强烈推荐伊齐克·本·甘的T-SQL基础知识。它真的帮助了我。