有没有办法在不使用用户定义函数的情况下在 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 上上传和预览图像(替换背景图像)?

有没有办法在不使用 AVFoundation 框架的情况下在 iOS 中录制音频?

有没有办法在不使用 jQuery UI 和 jQuery Mobile 的情况下在 jQuery 中左右滑动 [重复]