sql-server - 通过变量计算不同月份 - SSIS
问题描述
我需要做一个计算,从列“B”获得总和值,列 C = “Y”,然后除以列“A”的总和值,列 C = “X”,与价值观。
例子:
Date A B C
2015-02-31 796.92 885.47 X
2015-02-31 932.2900 932.29 Y
2015-02-31 803.29 1147.56 X
2015-02-31 839.1800 839.18 Y
2015-02-31 139.20 143.50 Y
2015-02-31 299.64 308.91 X
2015-02-31 125.47 129.35 X
2015-02-31 117.98 393.27 Y
2015-02-31 0.00 747.68 X
2015-01-31 735.29 758.03 Y
2015-01-31 0.00 683.24 Y
2015-01-31 0.00 734.25 X
2015-01-31 323.64 333.65 Y
2015-01-31 442.36 456.04 X
2015-03-31 52.84 54.47 X
2015-03-31 0.00 549.96 Y
2015-03-31 462.24 476.54 X
所以我需要使用 B(C=Y) 中的值除以一个月前的 A(C=X) 的值...
A B C
2015-02-31 442.36 456.04 X
2015-03-31 52.84 54.47 Y
2015-03-28 75.90 17.19 Y
在上面的这种情况下,它将是 (54.47 + 17.19) / 442.36。
因此,我需要使用 SQL 中的表来在仪表板中显示结果。
有人可以帮我吗?
谢谢!
解决方案
如果我正确理解了您的问题,那么这应该可以。这也假设在您的示例数据中月份之间没有间隔。如果可能存在差距,那么您将不得不在结果集之上覆盖一个日历表。
DECLARE @T TABLE(Date DATETIME,A DECIMAL(18,4),B DECIMAL(18,4),C NVARCHAR(10))
INSERT @T (Date,A,B,C) VALUES
('02/15/2015',5,5,'X'),('02/15/2015',5,5,'Y'),('02/15/2015',5,5,'X'),('02/15/2015',5,5,'Y'),('02/15/2015',5,5,'Y'),
('02/15/2015',5,5,'X'),('02/15/2015',5,5,'X'),('02/15/2015',5,5,'Y'),('02/15/2015',5,5,'X'),('01/15/2015',5,5,'Y'),
('01/15/2015',5,5,'Y'),('01/15/2015',5,5,'X'),('01/15/2015',5,5,'Y'),('01/15/2015',5,5,'X'),('03/15/2015',5,5,'X'),
('03/15/2015',5,5,'Y'),('03/15/2015',5,5,'X')
;WITH Detail AS
(
SELECT
A=CASE WHEN C='X' THEN A ELSE NULL END,
B=CASE WHEN C='Y' THEN B ELSE NULL END,
C,
Month = DATEPART(MONTH,Date),
Year = DATEPART(YEAR,Date)
FROM @T
)
,GroupedByMonth AS
(
SELECT
RowNumber = ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY Year,Month),
SumA = SUM(A),
SumB = SUM(B),
Month,
Year
FROM
Detail
GROUP BY
Year,Month
)
SELECT
This.Year,
This.Month,
ThisMonthSumB = This.SumB,
NextMonthSumA = Next.SumA,
Result = CASE WHEN Next.SumA = 0 THEN 0 ELSE This.SumB / Next.SumA END
FROM
GroupedByMonth This
LEFT OUTER JOIN GroupedByMonth Next ON Next.RowNumber = This.RowNUmber+1
或使用上个月的 SUM(A)
SELECT
This.Year,
This.Month,
ThisMonthSumB = This.SumB,
PriorMonthSumA = Prior.SumA,
Result = CASE WHEN Prior.SumA = 0 THEN 0 ELSE This.SumB / Prior.SumA END
FROM
GroupedByMonth This
LEFT OUTER JOIN GroupedByMonth Prior ON Prior.RowNumber = This.RowNUmber-1
推荐阅读
- scala - SBT 项目发布到 Maven 中心
- java - 如何在android的navigationdrawer中为标题添加图像
- html - 通过宏 (VBA) 自动填写 Web 表单的问题
- java - keycloak 中基于 GET 、 POST 、 PUT 、 DELETE 类型的身份验证
- javascript - 无论脚本正在运行,它始终默认工作
- mysql - Innodb 页面大小设置
- android-studio - Android Studio 3.4 中的 Gradle Build Variant 窗口
- python - 将 SQL Server 2016 与 django 连接,但用户用户名 odbc azure 出现登录失败错误
- sql - Access SQL 是同一表的同一字符串属性中另一个字符串的字符串属性部分吗?
- java - 如何在不覆盖先前条目的情况下将输入的字符串添加到二维数组中?