[英]Group By Column Name As parameter
假設我有一個名為Sales
的表。
我也有一個存儲過程是這樣的:
SELECT A FROM SALES GROUP BY A
SELECT B FROM SALES GROUP BY B
SELECT C FROM SALES GROUP BY C
SELECT D FROM SALES GROUP BY D
SELECT E FROM SALES GROUP BY E
我可以將存儲過程中的SELECT
語句數量減少到一個嗎?
換句話說,可以將group by中的列名用作參數嗎?
選項A-您可以使用動態sql:
DECLARE @sql NVARCHAR(MAX)
SELECT 'SELECT ' + @col + ' FROM SALES GROUP BY ' + col + '; '
EXEC (@sql)
選項B-您可以使用CASE
SELECT CASE @col WHEN 'A' THEN A
WHEN 'B' THEN B
WHEN 'C' THEN C
WHEN 'D' THEN D
WHEN 'E' THEN E
END
FROM SALES
GROUP BY CASE @col WHEN 'A' THEN A
WHEN 'B' THEN B
WHEN 'C' THEN C
WHEN 'D' THEN D
WHEN 'E' THEN E
END
(兩個選項都將@col作為字符串參數接收)
除非所有5列都是兼容的數據類型,否則您的想法都會破壞存儲過程協定,因為返回類型每次都會更改。 這意味着需要更復雜的客戶端代碼來處理此返回類型更改
如果它們都是相同的數據類型,為了避免使用動態SQL,可以使用此方法
SELECT DISTINCT
CASE @param
WHEN @param = 'A' THEN A
WHEN @param = 'B' THEN B
WHEN @param = 'C' THEN C
WHEN @param = 'D' THEN D
WHEN @param = 'E' THEN E
END
FROM
SALES;
雖然它仍然不是很有效。
如果您想要不同的聚合(例如SUM或COUNT),則可以使用其他方法來實現此目的而無需數據類型兼容性或動態SQL。 那么,您要解決的實際問題是什么?
例如,這意味着您可以在客戶端中干凈地選擇A到E
SELECT DISTINCT
COUNT(*) OVER (GROUP BY A) AS cntA,
COUNT(*) OVER (GROUP BY B) AS cntB,
COUNT(*) OVER (GROUP BY C) AS cntC,
COUNT(*) OVER (GROUP BY D) AS cntD,
COUNT(*) OVER (GROUP BY E) AS cntE
FROM
SALES;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.