2012-11-16 4 views
1

Я пытаюсь использовать CAST() в инструкции SQL, но это не позволяет мне видеть CAST (myDateTime, Date) как myLoginShortDate в группе? Я знаю только основы SQL, и я пытаюсь узнать больше.
данные могут выглядеть следующим образом:Могу ли я использовать CAST() в инструкции select?

КодКлиента междунар, нулевой Email VARCHAR (60) DateEntered DateTime

Я пытаюсь получить группировку по дате части DateTime и сгруппированы по электронной почте

Моя хранимая процедура выбора часть выглядит следующим образом:

 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“»

Я хочу, чтобы иметь возможность видеть:

электронная почта, LoginDate, FailedCount

[email protected], 11/01/12, 21

[email protected], 11/01/12, 17

[email protected], 10/30/12, 15

и так далее. Я уверен, что это всего лишь ошибка начинающих. У меня этот пост все испортился, но я надеюсь, что кто-то это поймет. Формат выбора выглядит лучше на моем компьютере.

+0

я вижу в своем комментарии к ответу Кори вы спросили о хорошей книге для перемещения ваших навыков T-SQL на следующий уровень. Я очень рекомендую «Основы T-SQL» Ицика Бен-Гана. Это действительно помогло мне. –

ответ

2

Оператор GROUP BY оценивается перед оператором SELECT, поэтому SQL-сервер не знает об псевдониме, которое вы дали в выражении в инструкции SELECT. Чтобы исправить это, вы просто должны повторить выражение в GROUP BY:

GROUP BY CAST(cll.DateEntered AS Date) 

Или завернуть простую часть вашего запроса с КТР, и сделать группировку по результатам КТР:

;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 

В качестве альтернативы вы можете включить содержимое CTE, как во вложенном операторе SELECT, как Mahmoud pointed out.

+0

Я получаю «CustomerLoginLog.Email» недействительным в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY. Можете ли вы порекомендовать хорошую книгу для тех, кто сделал базовый SQL и перешел в более сложные вещи? – user1830640

+0

@ user1830640: Это моя вина. Я обновил свой ответ, чтобы ответить на мою ошибку. И нет, наверное, у меня нет книг, которые я мог бы порекомендовать с головы. Проверьте [так] или Amazon для высоко оцененных книг SQL! –

+0

Спасибо, ты меня на правильном пути. Я переместил «COUNT (cll.email) AS FailedCount» в раздел MyQuery и поместил «*, COUNT (MyQuery.E-mail) AS FailedCount ", и он отлично работает. Перемещение с VFP на C# .net и SQL Server 2008 все сразу - это грубые вещи. :) – user1830640

0
Оператор

SELECT (логически) выполнен после предложения GROUP BY, так что в предложении GROUP BY не отображается этот псевдоним LoginDate. Вы должны использовать вид подзапроса или КТР, как так:

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 
Смежные вопросы