从上年同期的百分比差额

问题描述 投票:0回答:1

试图百分比差列添加到我的数据,我展示了最近3年我的查询中的销售和佣金,并希望上市,以显示在作了销售,也为量之差每个销售人员的差异百分比佣金在同一个月去年。因此,对于在2017年一月佣金和销售的款额,我想告诉他们是否有在两者之间发生了什么,2018年一月赚相比,现在在2017年一月挣量的增加或减少。

SELECT TOP (100) PERCENT 
    'ABC' AS CompanyCode, 
    ABC.AR_Salesperson.SalespersonName, 
    ABC.AR_SalespersonCommission.SalespersonDivisionNo, 
    ABC.AR_SalespersonCommission.SalespersonNo, 
    SUM(ABC.AR_SalespersonCommission.InvoiceTotal) AS InvoiceTotalSum, 
    SUM(ABC.AR_SalespersonCommission.CommissionAmt) AS CommissionAmtSum, 
    DATENAME(month, ABC.AR_SalespersonCommission.InvoiceDate) AS Month, 
    DATENAME(year, ABC.AR_SalespersonCommission.InvoiceDate) AS Year, 
    DATEPART(m, ABC.AR_SalespersonCommission.InvoiceDate) AS MonthNumber
FROM
    ABC.AR_Customer INNER JOIN
    ABC.AR_SalespersonCommission ON 
        ABC.AR_Customer.ARDivisionNo = ABC.AR_SalespersonCommission.ARDivisionNo AND 
        ABC.AR_Customer.CustomerNo = ABC.AR_SalespersonCommission.CustomerNo INNER JOIN
    ABC.AR_Salesperson ON 
        ABC.AR_SalespersonCommission.SalespersonDivisionNo = ABC.AR_Salesperson.SalespersonDivisionNo AND 
        ABC.AR_SalespersonCommission.SalespersonNo = ABC.AR_Salesperson.SalespersonNo
GROUP BY 
    ABC.AR_Salesperson.SalespersonName, 
    ABC.AR_SalespersonCommission.SalespersonDivisionNo, 
    ABC.AR_SalespersonCommission.SalespersonNo, 
    DATENAME(month, ABC.AR_SalespersonCommission.InvoiceDate), 
    DATENAME(year, ABC.AR_SalespersonCommission.InvoiceDate), 
    DATEPART(m, ABC.AR_SalespersonCommission.InvoiceDate)
HAVING
    (DATENAME(year, ABC.AR_SalespersonCommission.InvoiceDate) > DATEADD(year, - 4, GETDATE()))
ORDER BY 
    SalespersonName, 
    Year, 
    MonthNumber

想尽各种办法来获取数据要做到这一点,但一直没能像使用OVER PARTITION BY和所有。预期的结果和样本数据是在下面的链接。

Desired Results and Sample Data

sql sql-server tsql
1个回答
0
投票

您可以使用CTE和使用JOIN上年它:

; WITH L4Y
AS (SELECT TOP (100) PERCENT 
        'ABC' AS CompanyCode, 
        ABC.AR_Salesperson.SalespersonName, 
        ABC.AR_SalespersonCommission.SalespersonDivisionNo, 
        ABC.AR_SalespersonCommission.SalespersonNo, 
        SUM(ABC.AR_SalespersonCommission.InvoiceTotal) AS InvoiceTotalSum, 
        SUM(ABC.AR_SalespersonCommission.CommissionAmt) AS CommissionAmtSum, 
        DATENAME(month, ABC.AR_SalespersonCommission.InvoiceDate) AS Month, 
        DATENAME(year, ABC.AR_SalespersonCommission.InvoiceDate) AS Year, 
        DATEPART(m, ABC.AR_SalespersonCommission.InvoiceDate) AS MonthNumber
    FROM
        ABC.AR_Customer INNER JOIN
        ABC.AR_SalespersonCommission ON 
            ABC.AR_Customer.ARDivisionNo = ABC.AR_SalespersonCommission.ARDivisionNo AND 
            ABC.AR_Customer.CustomerNo = ABC.AR_SalespersonCommission.CustomerNo INNER JOIN
        ABC.AR_Salesperson ON 
            ABC.AR_SalespersonCommission.SalespersonDivisionNo = ABC.AR_Salesperson.SalespersonDivisionNo AND 
            ABC.AR_SalespersonCommission.SalespersonNo = ABC.AR_Salesperson.SalespersonNo
    GROUP BY 
        ABC.AR_Salesperson.SalespersonName, 
        ABC.AR_SalespersonCommission.SalespersonDivisionNo, 
        ABC.AR_SalespersonCommission.SalespersonNo, 
        DATENAME(month, ABC.AR_SalespersonCommission.InvoiceDate), 
        DATENAME(year, ABC.AR_SalespersonCommission.InvoiceDate), 
        DATEPART(m, ABC.AR_SalespersonCommission.InvoiceDate)
    HAVING
        (DATENAME(year, ABC.AR_SalespersonCommission.InvoiceDate) > DATEADD(year, - 4, GETDATE()))
    )
SELECT L4Y.*
    , InvoiceTotalPrevYear = COALESCE(LY.InvoiceTotalSum, 0)
    , CommissionAmtSumPrevYear = COALESCE(LY.CommissionAmtSum, 0)
FROM L4Y
    LEFT JOIN L4Y LY
        ON L4Y.CompanyCode = LY.CompanyCode
        AND L4Y.SalespersonName = LY.SalespersonName
        --...(join on ALL fields except YEAR)
        AND l4y.[Month] = LY.[Month]
        -- Here's where the magic happens:
        AND L4Y.[Year] = (LY.[Year]-1) ;
© www.soinside.com 2019 - 2024. All rights reserved.