1

SQLステートメントでCAST()を使用しようとしていますが、group by?でCAST(myDateTime、Date)をmyLoginShortDateとして表示できません。私はSQLの基本しか知らず、もっと学ぼうとしています。
データは次のようになります。

CustomerID int、null Email varchar(60)DateEntered DateTime

日時の日付部分でグループ化して、Eメールでグループ化しようとしています

私のストアドプロシージャの選択部分は次のようになります。

       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'」を返しています

見たい:

Eメール、LoginDate、FailedCount

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

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

xyz @ test.com、10/30 / 12、15

等々。これは初心者の間違いだと思います。私はこの投稿をすべて台無しにしていますが、誰かがそれを理解してくれることを願っています。選択した形式は、私のコンピューターの方が見栄えがします。

4

2 に答える 2

2

ステートメントはステートメントのGROUP BY前に評価されるSELECTため、SQLサーバーはステートメントで式を指定したエイリアスを認識しませんSELECTGROUP BYこれを修正するには、 :の式を繰り返す必要があります。

GROUP BY CAST(cll.DateEntered AS Date)

または、クエリの単純な部分を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

または、 Mahmoudが指摘したように、ネストされたSELECTステートメントのようにCTEのコンテンツを含めることもできます。

于 2012-11-16T20:12:44.617 に答える
0

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
于 2012-11-16T20:14:36.427 に答える