微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有一种方法可以在不使用用户定义函数的情况下在SQL中动态执行查询?

如何解决有没有一种方法可以在不使用用户定义函数的情况下在SQL中动态执行查询?

我目前正在处理包含一些文档数据的表,重点放在包含文档日期和净收入的列上。我要做的是编写一条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',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

这将生成预期表。 但是 问题是,我的老板希望我出于某种原因不使用任何功能。我可以声明变量。所以我的问题是,有没有一种方法可以在不使用函数的情况下解决?一会儿循环吗? 我知道我可以每月选择一个命令,然后将它们连接在一起,但是我正在寻找比11个连接更复杂的解决方案... 任何想法? :)

解决方法

不需要涉及该函数的复杂逻辑。据我了解您的问题陈述,您可以使用条件聚合在单个查询中获得所需的结果:

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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。