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
4

2 に答える 2

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)しないでください。

于 2012-06-21T19:19:18.507 に答える
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 
于 2012-06-21T19:19:28.773 に答える