2012-06-21 37 views
3

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

+0

没有臃肿的代码。尼斯。什么是'T'? – steventnorris

+0

@steventnorris - 在这种情况下,* table *,但它并不意味着什么。您必须在使用派生表时给别名,所以我将其命名为“T”。 – Lamak

2

你的问题说“变量”,但我认为你的意思是列别名。只是FYI。

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

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 
+0

这在标准sql中不起作用,因为在group by语句中不接受“as MonthYear”。没有“as MonthYear”这个声明应该有效。 –

+0

谢谢,这是一个粗心的剪切和粘贴。编辑。 –

+0

这工作。小杂乱,但它的作品。我希望有一些修剪的解决方案,但有时修剪是不可能的。另外,我会改变verbage以匹配列别名。 – steventnorris