2014-11-19 5 views
0

Следующий код работает отлично:Использование псевдонимов в GROUP BY пункте

SELECT 
    ISNULL(U.username, U.users_id) AS users_name, 
    CONVERT(varchar(20), H.date_time, 103) AS date_time, 
    SUM(sale_val) AS sales_val 
FROM 
    res R 
     INNER JOIN invoice_hdr H ON H.guid = R.guid 
     INNER JOIN users U ON U.user_no = H.user_no 
GROUP BY 
    ISNULL(U.username, U.users_id), 
    CONVERT(varchar(20), H.date_time, 103) 

Но я найти предложения GROUP BY избыточно, и попытался группирование по псевдонимами:

GROUP BY 
    users_name, 
    date_time 

Я получаю следующее сообщение об ошибке :

Invalid column name 'users_name'

То же самое для date_time. Есть ли способ сделать это?

+0

Я думаю, вы можете сделать 'group by 1,2', которые являются номерами столбцов в вашем запросе. –

+0

Пробовал и получил следующее: «Каждое выражение GROUP BY должно содержать по крайней мере один столбец, который не является внешней ссылкой». –

ответ

1

Да, окружив его подзапроса и выполнение агрегации на внешнем уровне:

select sq.users_name, sq.date_time, sum(sq.sale_var) 
from (
SELECT 
    ISNULL(U.username, U.users_id) AS users_name, 
    CONVERT(varchar(20), H.date_time, 103) AS date_time, 
    sale_val 
FROM 
    res R 
     INNER JOIN invoice_hdr H ON H.guid = R.guid 
     INNER JOIN users U ON U.user_no = H.user_no 
) sq 
GROUP BY sq.users_name, sq.date_time; 

ORDER BY это единственное место, где вы можете ссылаться на псевдоним на том же уровне, с его определением.

0
SELECT RR.users_name,RR.date_time,SUM(RR.sale_val) Sale FROM 
(
SELECT 
    ISNULL(U.username, U.users_id) AS users_name, 
    CONVERT(varchar(20), H.date_time, 103) AS date_time, 
    sale_val 
FROM 
    res R 
     INNER JOIN invoice_hdr H ON H.guid = R.guid 
     INNER JOIN users U ON U.user_no = H.user_no 

     ) RR 
GROUP BY 
    RR.users_name, 
    CONVERT(varchar(20), RR.date_time, 103)