有没有办法在不使用用户定义函数的情况下在 SQL 中动态执行查询?
Posted
技术标签:
【中文标题】有没有办法在不使用用户定义函数的情况下在 SQL 中动态执行查询?【英文标题】:Is there a way to dynamically execute queries in SQL without using user defined function? 【发布时间】:2020-09-19 17:18:42 【问题描述】:我目前正在处理包含一些文档数据的表格,重点关注包含文档日期和净收入的列。我要做的是写一个sql语句,它会产生一个表格,显示每年的净收入分成几个月的汇总,如下所示:
year | january | february | ... | december
-------------------------------------------------------------------------------
2019 | [total income in jan 2019] | [total income in feb 2019] | ...
2018 | [total income in jan 2018] | ...
...
为了解决这个问题,我创建了以下函数:
-- returns total income for given @month in given @year
CREATE FUNCTION dbo.Getincome(@year INT,
@month INT)
returns INT
AS
BEGIN
DECLARE @result INT
SELECT @result = Sum(income)
FROM dk
WHERE date IS NOT NULL
AND Year(date) = @year
AND Month(date) = @month
GROUP BY Year(date)
RETURN Isnull(@result, 0)
END
并像这样执行查询:
SELECT Year(date) AS 'year',
dbo.Getincome(Year(date), 1) AS 'january',
dbo.Getincome(Year(date), 2) AS 'february',
(...) dbo.getincome(year(date), 12) AS 'december'
FROM dk
WHERE date IS NOT NULL
GROUP BY year(date)
ORDER BY year(date) DESC
这会产生预期的表格。 但是 问题是,我的老板出于某种原因希望我不要使用任何功能。我可以声明变量。所以我的问题是,有没有办法在不使用函数的情况下解决这个问题?一个while循环可能吗? 我知道我可以为每个月创建一个选择命令,然后将它们连接在一起,但我正在寻找比 11 个连接更复杂的解决方案...... 任何的想法? :)
【问题讨论】:
【参考方案1】:不需要这个涉及函数的复杂逻辑。据我了解您的问题陈述,您可以使用条件聚合在单个查询中获得所需的结果:
select year(date) year,
sum(case when month(date) = 1 then income else 0 end) january,
sum(case when month(date) = 2 then income else 0 end) february,
...
from dk
group by year(date)
order by year(date)
【讨论】:
感谢您的回答,但总和报表会汇总每一年的收入吗? @Agata:是的,因为年份在group by
子句中。以上是关于有没有办法在不使用用户定义函数的情况下在 SQL 中动态执行查询?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在不使用 __init__ 的情况下在实例初始化时自动运行方法?
如何在不使用pivot和unpivot的情况下在SQL Server中水平显示数据?
有没有办法在不使用画布的情况下在 JavaScript 中合并图像?
javascript - 有没有办法在不刷新页面的情况下在 div 上上传和预览图像(替换背景图像)?