首页 > 解决方案 > 通过变量计算不同月份 - 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 中的表来在仪表板中显示结果。

有人可以帮我吗?

谢谢!

标签: sql-serverssis

解决方案


如果我正确理解了您的问题,那么这应该可以。这也假设在您的示例数据中月份之间没有间隔。如果可能存在差距,那么您将不得不在结果集之上覆盖一个日历表。

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

推荐阅读