我有以下腳本
SELECT
CASE
WHEN Grade </span> 4
THEN 'Fail'
WHEN 等級>=4 and 等級< 6
THEN 'C
WHEN 等級>=6 and 等級< 8
THEN 'Ok
ELSE 'Exc.'
END AS 【狀態】。
COUNT(Grade) AS v
FROM(GradeList)
等級串列
GROUP BY
[狀態]。
而且它沒有看到Status列。我不明白為什么,有什么問題嗎?
uj5u.com熱心網友回復:
這就是SQL Server(和SQL)的定義方式。 在SELECT中定義的列別名在FROM、WHERE或GROUP BY子句中不能使用。
對此有多種解決方案。 我最喜歡的是使用APPLY,因為這在FROM子句中定義了別名:
SELECT v.Status, COUNT(*) as v
FROM GradeList gl CROSS APPLY
(VALUES (CASE WHEN Grade< 4 THEN 'Fail'/span>
WHEN Grade < 6 THEN 'C'/span>
WHEN Grade < 8 THEN 'OK'
ELSE 'Exc.'
END)
) v(Status)
GROUP BY v.Status。
注意,這也簡化了CASE的邏輯。 第一個匹配條件被回傳,所以不需要BETWEEN。 這實際上使添加和洗掉條件變得更加容易,如果你想調整查詢的話。
uj5u.com熱心網友回復:
SQL Server以一個特定的邏輯順序來處理SQL陳述句。由于SELECT子句在GROUP BY子句之后,GROUP BY子句不會看到列的別名。
你可以使用派生表或通用表運算式來解決這個問題。
SELECT Status, COUNT(Grade) AS v
FROM(等級)
(
SELECT[/span
CASE[/span]WHEN Grade < 4
THEN 'Fail'
WHEN 等級>=4 and 等級< 6
THEN 'C
WHEN 等級>=6 and 等級< 8
THEN 'Ok
ELSE 'Exc.'
END AS 【狀態】。
等級
FROM [Status], Grade
等級串列
) AS g(Status,Grade)
GROUPBY
[狀態]。
;WITH cte_gradelist(Status,Grade) as
(
SELECT
CASE[/span]WHEN Grade < 4
THEN 'Fail'
WHEN 等級>=4 and 等級< 6
THEN 'C
WHEN 等級>=6 and 等級< 8
THEN 'Ok
ELSE 'Exc.'
END AS 【狀態】。
等級
FROM [Status], Grade
等級串列
)
SELECT Status, COUNT(Grade) AS v
FROM cte_gradelist
GROUPBY
[狀態]。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/314806.html
標籤:
上一篇:按組別條件下的結果求和
