Группировать по псевдониму столбца

Я хочу сгруппировать оператор sql по псевдониму столбца. По сути, я хочу, чтобы нижеследующее функционировало так, как должно логически, но группировка по столбцу, созданному с помощью as, не разрешена. (Недопустимое имя столбца). У кого-нибудь есть советы?

SELECT 
    CASE
    WHEN Date IS NULL
    THEN 'EMPTY'
    ELSE
        CASE
        WHEN Date = '1/1/1753'
        THEN 'UNAVAILABLE'
        ELSE CAST(MONTH(Date) as varchar(MAX))+
             '/'+ CAST(YEAR(Date) as varchar(MAX))
        END
    END AS MonthYear
FROM tbltablename
GROUP BY MonthYear

person steventnorris    schedule 21.06.2012    source источник
comment
Извините, неправильно прочитал ваш вопрос, удалил мой ответ   -  person Kevin DiTraglia    schedule 21.06.2012


Ответы (2)


Для непосредственной проблемы группировки вам нужно либо сгруппировать по тому же выражению или вычислению вашего нового столбца, либо использовать его из производной таблицы.

SELECT MonthYear
FROM (  SELECT Columns,
            CASE
            WHEN Date IS NULL
            THEN 'EMPTY'
            ELSE
                CASE
                WHEN Date = '1/1/1753'
                THEN 'UNAVAILABLE'
                ELSE CAST(MONTH(Date) as varchar(2))+
                     '/'+ CAST(YEAR(Date) as varchar(4))
                END
            END AS MonthYear
        FROM tbltablename) T
GROUP BY MonthYear

С другой стороны, вы не должны использовать VARCHAR(MAX), если в этом нет необходимости.

person Lamak    schedule 21.06.2012
comment
@steventnorris - В данном случае table, но это ничего не значит. Вы должны указать псевдоним при использовании производных таблиц, поэтому я назвал его T. - person Lamak; 21.06.2012

В ваших вопросах говорится «переменная», но я думаю, вы имеете в виду псевдоним столбца. Просто к вашему сведению.

Использование фактического определения столбца должно работать нормально. Непроверено, но это должно делать то, что вам нужно:

SELECT 
    CASE
    WHEN Date IS NULL
    THEN 'EMPTY'
    ELSE
        CASE
        WHEN Date = '1/1/1753'
        THEN 'UNAVAILABLE'
        ELSE CAST(MONTH(Date) as varchar(MAX))+
             '/'+ CAST(YEAR(Date) as varchar(MAX))
        END
    END AS MonthYear
FROM tbltablename
GROUP BY
    CASE
    WHEN Date IS NULL
    THEN 'EMPTY'
    ELSE
        CASE
        WHEN Date = '1/1/1753'
        THEN 'UNAVAILABLE'
        ELSE CAST(MONTH(Date) as varchar(MAX))+
             '/'+ CAST(YEAR(Date) as varchar(MAX))
        END
    END 
person Phil Sandler    schedule 21.06.2012
comment
Это не работает в стандартном sql, потому что as MonthYear не принимается в операторе group by. Без as MonthYear оператор должен работать. - person Gordon Linoff; 21.06.2012
comment
Спасибо, это было небрежно вырезано и вставлено. Отредактировано. - person Phil Sandler; 21.06.2012
comment
Это работает. Немного сумбурно, но работает. Я надеялся на какое-то решение для обрезки, но иногда обрезка невозможна. Кроме того, я изменю формулировку, чтобы она соответствовала псевдониму столбца. - person steventnorris; 21.06.2012
comment
Это действительно немного раздувает код. Если вы хотите использовать ORDER BY для одного и того же выражения, это хуже, так как у вас есть три раза вместо двух. :) Настоящим недостатком является то, что вам придется редактировать оба, если вы вносите изменения в любой из них. - person Phil Sandler; 21.06.2012
comment
@PhilSandler - вы можете использовать псевдоним столбца в своем order by, на самом деле нет необходимости снова писать одно и то же выражение. - person Lamak; 21.06.2012
comment
@PhilSandler вместо этого вы обычно можете упорядочить по порядковому номеру столбца. например выберите a_very_complex_expression, другое_very_complex_expression из таблицы в порядке 1, 2 - person Lord Peter; 21.06.2012
comment
@Lamak Вы правы - кажется, я думал о предложении WHERE. - person Phil Sandler; 21.06.2012
comment
@LordPeter: я бы посчитал использование порядкового номера в предложении ORDER BY во всем, кроме специального запроса, очень плохой практикой. sqlblog. ком/блоги/аарон_бертранд/архив/2009/10/06/ - person Phil Sandler; 21.06.2012