按列别名分组

时间:2012-06-21 19:11:08

标签: sql database group-by case

我想按列别名对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

2 个答案:

答案 0 :(得分:4)

对于分组的直接问题,您需要按相同的表达式或计算新列进行分组,或者从派生表中使用它。

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)

答案 1 :(得分:2)

你的问题是“变量”,但我认为你的意思是列别名。仅供参考。

使用实际的列定义应该可以正常工作。未经测试,但这应该做你需要的:

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