Sql 按列别名分组
我想按列别名对sql语句进行分组。从本质上讲,我希望下面的内容在逻辑上能够正常工作,但不允许使用as创建的列进行分组。(无效的列名)。有人有什么建议吗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
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
。