有没有一种方法可以在不使用用户定义函数的情况下在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)