您不能在GROUP BY
中使用別名,因爲它在應用別名之前被解析。唯一可以使用別名的地方在ORDER BY
子句中,因爲它是在定義了別名的SELECT
之後解析的唯一子句。
典型的解決方法要麼重複表達GROUP BY
子句中:
SELECT x = CASE ... END, SUM(something)
FROM dbo.somewhere
GROUP BY CASE ... END;
,或者使用CTE:
;WITH src AS
(
SELECT x = CASE ... END, something
FROM dbo.somewhere
)
SELECT x, SUM(something)
FROM src
GROUP BY x;
或者使用子查詢:
SELECT x, SUM(something)
FROM
(
SELECT x = CASE ... END, something
FROM dbo.somewhere
) AS src
GROUP BY x;
這些都應該優化類似,但你應該測試你的具體情況,以確保。
在你的情況,你可以寫成如下這樣:
SELECT CustID,
[Read] = MAX(CASE permission WHEN 'read' THEN 'X' END),
[Write] = MAX(CASE permission WHEN 'write' THEN 'X' END),
[Own] = MAX(CASE permission WHEN 'own' THEN 'X' END),
[Destroy] = MAX(CASE permission WHEN 'destroy' THEN 'X' END)
FROM dbo.rights
GROUP BY custID;
或者這樣:
SELECT CustID,
MAX([Read]), MAX([Write]), MAX([Own]), MAX([Destroy])
FROM
(
SELECT CustID,
[Read] = CASE permission WHEN 'read' THEN 'X' END,
[Write] = CASE permission WHEN 'write' THEN 'X' END,
[Own] = CASE permission WHEN 'own' THEN 'X' END,
[Destroy] = CASE permission WHEN 'destroy' THEN 'X' END
FROM dbo.rights
) AS src
GROUP BY custID;
請不要使用單引號來分隔列或表'alias'
。不僅是語法不贊成,而且它也使得實體看起來像一個字符串文字。如果必須轉義(例如,如果您選擇錯誤的列名稱),請使用[square brackets]
。
「您不能在GROUP BY中使用別名,因爲它在應用別名之前被解析。」但是爲什麼在應用別名之前解析它? – 2013-10-24 11:03:54
@anario我不知道我是否可以真正告訴你爲什麼,除了這是SQL Server的工作方式。 (我相信MySQL在這方面稍微寬鬆一點,但大多數真實平臺應該更貼近標準。)關於[這個問題]的更多細節(http://dba.stackexchange.com/questions/19762/爲什麼是選擇子句列出第一/)和[這個問題](http://dba.stackexchange.com/questions/21965/why-are-queries-parsed-in-such-a-way -that-disallows-the-use-of-column-aliases-in /)over dba.se. – 2013-10-24 13:20:50
有用的鏈接,我現在滿意:) – 2013-10-24 13:55:53