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