如何动态地进行递归查询?
让我们说:
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
我的整个查询:
示例数据:
让我们说数量表如下:
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))
答案 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);
您的原始数据布局不清楚,但这应该很容易理解。你想使用窗口函数,而不是递归。