如何动态地进行递归查询?

时间:2016-12-03 13:30:00

标签: sql sql-server recursion sql-server-2012 common-table-expression

如何动态地进行递归查询?

让我们说:

QuantityDate可能是:

Month 3  The first quarter 
Month 6  The second quarter
Month 9  The third quarter
Month 12 The fourth quarter

如果用户选择第二季度6

  

然后我将对第一季度的数据+第二季度的数据进行求和

如果用户选择第三季度9

  

然后我会将第一季度的数据与第二季度的数据相加   +第三季度的数据

等等......

我的查询是这样的:

这里用户选择第二季度(6),所以我将第一季度数据+第二季度数据加起来如下:

,((ISNULL(d.SalesCost,0)*-1)/

(ISNULL(d.LocalSales,0)+ISNULL(d.Exporting,0) --The selected quarter data
+
(SELECT ISNULL(e.LocalSales,0)+ISNULL(e.Exporting,0)--The First Quarter
FROM CTE e
WHERE e.[Year] = d.[Year] 
AND e.period =2
AND e.PeriodTypeId =2 
AND e.CompanyId = d.CompanyId
AND MONTH(e.QuantityDate)=3))) AS Tot1,
,d.QuantityDate
FROM CTE d 
INNER JOIN CTE t 
ON d.[Year] = t.[Year] 
AND d.period = t.period
AND d.PeriodTypeId = t.PeriodTypeId
AND d.CompanyId = t.CompanyId
AND d.QuantityDate =t.QuantityDate
WHERE  d.[Year] IN (2016,2015) AND d.PeriodTypeId =2 AND d.Period =2
AND YEAR(d.QuantityDate)IN (2016,2015) AND MONTH(d.QuantityDate)=6
ORDER BY d.CompanyId, d.[Year] DESC

我的整个查询:

Query

示例数据:

让我们说数量表如下:

LocalSales  Exporting  QuantityDate
 15           20       1-3-2016
 22           80       1-6-2016
 40           20       1-9-2016

当用户选择第二季度时,我会在CTE d

中获得第一季度和第二季度数据
 15           20       1-3-2016
 22           80       1-6-2016

然后我加入CTE e

如果说SalesCost = -20例如

然后tot1应= 20/((15+20)+(22+80))

1 个答案:

答案 0 :(得分:1)

你不需要递归。只是累积金额。

很难看到您的数据是什么样的,但查询可能如下所示:

SELECT companyid, quarter(QuantityDate) as qq,
       SUM(COALESCE(e.LocalSales, 0) + COALESCE(e.Exporting, 0)) as quartersales,
       SUM(SUM(COALESCE(e.LocalSales, 0) + COALESCE(e.Exporting, 0))) OVER
           (PARTITION BY companyid, order by quarter(QuantityDate)) as running_sum
FROM t
WHERE e.[Year] = d.[Year] 
GROUP BY companyid, quarter(QuantityDate);

您的原始数据布局不清楚,但这应该很容易理解。你想使用窗口函数,而不是递归。