繁体   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