Sql 按列别名分组

Sql 按列别名分组,sql,database,group-by,case,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 varch

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

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

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)

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

使用实际的列定义应该可以很好地工作。未经测试,但这应该满足您的需要:

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 

抱歉误读了您的问题,删除了我的答案这在标准sql中不起作用,因为group by语句中不接受“as MonthYear”。如果没有“as MonthYear”这个词,这句话应该可以用。谢谢,这是一个粗心的剪切和粘贴。编辑。这很有效。有点乱,但它能工作。我希望有一些修剪的解决方案,但有时修剪是不可能的。另外,我将更改详细信息以匹配列别名。它确实会使代码膨胀一点。如果你想用同一个表达式排序,那就更糟了,因为你要用三次而不是两次真正的缺点是,如果对其中一项进行更改,则必须同时编辑这两项。@PhilSandler-您可以使用
order by
上列的别名,实际上不必编写相同的表达式again@steventnorris-在这种情况下,表,但它没有任何意义。使用派生表时必须提供别名,因此我将其命名为
T