簡體   English   中英

按列名稱分組作為參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM