我一直在寻找一种计算 Excel 的好方法,例如桌面应用程序仪表板图表的趋势线。
最常见的趋势类型一定是这样的
Type = 1 Linear Y = a + b*X
Type = 2 EXponential Y = a*e^(b*X)
Type = 3 Logarithmic Y = a + b*ln(X)
Type = 4 Power Y = a*X^b
这就是我解决问题的方法。
最佳答案
正如我在其他评论中提到的,这可以写成内联 TVF,而不是多行 TVF。我从字面上理解了 OP 的解决方案,但是,一些 CTE 允许我们做到这一点:
CREATE FUNCTION dbo.tvf_TrendLine (@Type tinyint,
@Rawdata XYTableType READONLY)
RETURNS TABLE
AS RETURN
WITH xy AS(
SELECT CONVERT(decimal(38,10),COUNT(*)) AS n,
CONVERT(decimal(38,10),SUM(CASE WHEN @Type IN (3,4) THEN LOG(X) ELSE X END)) AS x,
CONVERT(decimal(38,10),SUM(CASE WHEN @Type IN (3,4) THEN LOG(X) * LOG(X) ELSE X * X END)) AS x2,
CONVERT(decimal(38,10),SUM(CASE WHEN @Type IN (2,4) THEN LOG(Y) ELSE Y END)) AS y,
CONVERT(decimal(38,10),SUM(CASE WHEN @Type IN (2,4) THEN LOG(Y) * Y ELSE Y * Y END)) AS y2,
CONVERT(decimal(38,10),SUM(CASE WHEN @Type = 2 THEN X * LOG(Y) WHEN @Type = 3 THEN LOG(X) * Y WHEN @Type = 4 THEN LOG(X) * LOG(Y) ELSE X * Y END)) AS xy
FROM @RawData
WHERE Y IS NOT NULL),
ab AS(
SELECT n,
x,
x2,
y,
Y2,
xy,
CONVERT(decimal(38,10),CASE WHEN @Type IN (2,4) THEN EXP((x2 * y - x * xy) / (n * x2 - x * x))
ELSE (x2 * y - x * xy) / (n * x2 - x * x)
END) AS a,
CONVERT(decimal(38,10),(n * xy - x * y) / (n * x2 - x * x)) AS b
FROM xy)
SELECT rd.X,
rd.Y,
CASE
WHEN @Type = 2 THEN ab.a * EXP(LOG(EXP(1)) * (ab.b * rd.X))
WHEN @Type = 3 THEN ab.a + ab.b * LOG(rd.X)
WHEN @Type = 4 THEN ab.a * EXP(LOG(rd.X) * ab.b)
ELSE ab.a + ab.b * rd.X
END AS Yt
FROM @Rawdata rd
CROSS JOIN ab;
GO
这返回的结果与OP的答案完全相同。
关于sql - 如何在SQL函数中计算不同的趋势线类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55849584/