在SQL Server

时间:2017-09-06 14:19:26

标签: sql sql-server linear-regression

我有一个将返回列的查询:

StoreNo

财政周刊

SalesVar

有28家商店,

和财政周是25 - 30,

销售额是该周销售额差异的总和

我想在子查询中包含这个,它将为我提供输出:

StoreNo

LinearRegression(基于6周销售历史[已知Y])

我通常只使用LINEST

在Excel中执行此操作

我猜它会是这样的:

Select
A.StoreNo
A.LinearRegressionCalculation

From (SubQuery) A

我用来获取6周销售历史的查询是:

SELECT
    EU.[Store No]                                                                            As 'StoreNo'
    ,SA.FISCALWEEK                                                                           As 'FiscalWeek'
    ,CONVERT(DECIMAL(5,4),
    (  SUM(CASE WHEN SA.FISCALYEAR = 2017  THEN SA.SALESEXVAT/SA.EXCHANGERATEEURO END)  /
       SUM(CASE WHEN SA.FISCALYEAR = 2016  THEN SA.SALESEXVAT/SA.EXCHANGERATEEURO END)  ) -1) AS 'SalesVar'
FROM 
    [BHXSQL2014-DEV].BMANALYTICS.DBO.EUACTIVESTORES AS EU
INNER JOIN
    [EUUKSQL01].[DASHBOARD].[DBO].[SALESAGGREGATEWEEK] AS SA
ON 
    EU.[Store No] = SA.BRANCHNO
    And EU.[Store No] In (
    8702,8711,8701,4167,4164,4160,4169,4155,4794,4746,1701,4619,4617,8867,8878,8891,8743,8876,4806,4710,4100,4826,4148,8757,8866,8787,8821,8756
    )
    And SA.Fiscalweek between 25 and 30
--COMP FLAG (Y=COMP WEEK, N=NONCOMP WEEK, 'WHERE' STATEMENT EXCLUDES NON COMP WEEKS)
    AND CASE WHEN LEFT(EU.[COMP WEEK],4) < 2017 THEN 'Y' 
             WHEN RIGHT(EU.[COMP WEEK],2) < SA.FISCALWEEK THEN 'Y' 
             ELSE 'N' END 
             = 'Y'
GROUP BY 
    EU.[Store No]
    ,SA.FISCALWEEK
ORDER BY 
    EU.[Store No]

1 个答案:

答案 0 :(得分:1)

最终解决了问题(尽管LINEST的结果很轻微)

Select
    MYDATA3.StoreNo
    ,slope
    ,ybar - xbar * slope as 'Intercept'
From
(   Select
        MYDATA2.StoreNo
        ,Sum((x - xbar) * (y - ybar)) / Sum((x - xbar) * (x - xbar)) As 'Slope'
        ,Max(ybar) As ybar
        ,Max(xbar) As xbar
    From
    (   Select
            MYDATA.StoreNo
            ,avg(MYDATA.SalesVar) Over (Partition By MYDATA.StoreNO Order By FiscalWeek Rows Unbounded Preceding) as 'ybar'
            ,MYDATA.SalesVar as 'y'
            ,avg(MYDATA.FiscalWeek) Over(Partition By MYDATA.StoreNO Order By FiscalWeek Rows Unbounded Preceding) as 'xbar'
            ,MYDATA.FiscalWeek as 'x'
        From
        (   Select
                EU.[Store No]                                                                            As 'StoreNo'
                ,SA.FISCALWEEK                                                                           As 'FiscalWeek'
                ,Convert(DECIMAL(5,4),
                (  Sum(Case When SA.FISCALYEAR = 2017  Then SA.SALESEXVAT/SA.EXCHANGERATEEURO END)  /
                   Sum(Case When SA.FISCALYEAR = 2016  Then SA.SALESEXVAT/SA.EXCHANGERATEEURO END)  ) -1) As 'SalesVar'
            From 
                [BHXSQL2014-DEV].BMANALYTICS.DBO.EUACTIVESTORES AS EU
            INNER JOIN
                [EUUKSQL01].[DASHBOARD].[DBO].[SALESAGGREGATEWEEK] AS SA
            ON 
                EU.[Store No] = SA.BranchNo
                And EU.[Store No] In (
                8702,8711,8701,4167,4164,4160,4169,4155,4794,4746,1701,4619,4617,8867,8878,8891,8743,8876,4806,4710,4100,4826,4148,8757,8866,8787,8821,8756
                )
                And SA.Fiscalweek between 25 and 30
            --COMP FLAG (Y=COMP WEEK, N=NONCOMP WEEK, 'WHERE' STATEMENT EXCLUDES NON COMP WEEKS)
                AND Case When LEFT(EU.[COMP WEEK],4) < 2017 Then 'Y' 
                         When RIGHT(EU.[COMP WEEK],2) < SA.FISCALWEEK Then 'Y' 
                         Else 'N' END 
                         = 'Y'
            Group BY 
                EU.[Store No]
                ,SA.FISCALWEEK 
                ) MYDATA    ) MYDATA2
    Group BY
        MYDATA2.StoreNo ) MYDATA3