我在 SQL Server 中有一個表,我按 ID 對其進行了分組,并使用其他資料的計數創建了 2 個新列。我希望能夠同時創建另一列,如果兩列中的計數大于數字,則顯示 1,否則將顯示 2。但是,當我嘗試時,它顯示無效的列名,我猜是我的計數列不在原始表中?
我的資料類似于:
ID Data1 Data2
-------------------------
0 1 1 5
1 1 2 5
2 1 5 8
3 1 7 9
4 2 8 5
5 2 7 3
6 2 9 2
7 3 3 1
8 3 3 6
9 3 2 7
10 3 6 3
11 3 8 0
所需的輸出(如果 >= 4,則代碼??為 1,否則為 2):
ID CountData1 CountData2 Code
------------------------------------
0 1 4 4 1
1 2 3 3 2
2 3 5 5 1
當前查詢:
SELECT
ID,
COUNT(Data1) AS CountData1,
COUNT(Data2) AS CountData2,
(CASE WHEN (CountData1 >= 4 and CountData2 >= 4) THEN 1 ELSE 2 END) AS Code
FROM
Table
GROUP BY
ID
uj5u.com熱心網友回復:
SQL 陳述句的決議方式,不能在同一范圍內參考剛剛創建的運算式。
您可以再次重復這些運算式:
SELECT
ID,
COUNT(Data1) AS CountData1,
COUNT(Data2) AS CountData2,
(CASE WHEN (COUNT(Data1) >= 4 and COUNT(Data2) >= 4) THEN 1 ELSE 2 END)
AS Code
FROM
dbo.Table
GROUP BY
ID;
或者使用 CTE 或派生表:
-- CTE
;WITH cte AS
(
SELECT ID,
COUNT(Data1) AS CountData1,
COUNT(Data2) AS CountData2
FROM dbo.Table
GROUP BY ID
)
SELECT ID, CountData1, CountData2,
CASE WHEN CountData1 >= 4 AND CountData2 >- 4
THEN 1 ELSE 2 END AS Code
FROM cte;
-- Derived Table
SELECT ID, CountData1, CountData2,
CASE WHEN CountData1 >= 4 AND CountData2 >- 4
THEN 1 ELSE 2 END AS Code
FROM
(
SELECT ID,
COUNT(Data1) AS CountData1,
COUNT(Data2) AS CountData2
FROM dbo.Table
GROUP BY ID
) AS DerivedTable;
這些都表現相同,盡管有些人認為第一個更糟,因為您參考了COUNT()更多的時間。SQL Server 非常擅長不重復它不需要的作業,事實上,上述所有三個查詢都產生完全相同的執行計劃,具有完全相同的成本、相同的讀取次數、相同的輸出和完全相同的數量運算式的計算。CPU 和持續時間會略有不同,因為計算機。
如果您遇到 CTE 產生比重復運算式更好的計劃的情況(請注意,在某些情況下,兩種變體都可能產生多個計數運算式),請將其張貼在某處。
uj5u.com熱心網友回復:
SELECT TT.ID,TT.CountData1,TT.CountData2,
CASE WHEN TT.CountData1>= 4 and TT.CountData2>=4 THEN 1 ELSE 2 END CODE
FROM
(SELECT ID,
COUNT(Data1) AS CountData1,
COUNT(Data2) AS CountData2
FROM
Table
GROUP BY
ID)TT;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/311526.html
標籤:sql sql-server 查询语句 通过...分组 案件
下一篇:遍歷行并洗掉具有特定值的行

