2017-09-06 2 views
1

J'ai une requête qui retourne les colonnes:Calculer régression linéaire Dans SQL Server

StoreNo

FiscalWeek

SalesVar

Il y a 28 magasins,

et la semaine fiscale est de 25 - 30,

Et les ventes sont la somme de sal es variance pour cette semaine

Je veux contenir cela dans une requête sous qui me donnera une sortie avec:

StoreNo

régression linéaire (basé sur l'historique des ventes de 6 semaines [Connu des Y])

Je normalement le faire dans Excel en utilisant LINEST

Je devine que ce serait ressembler à:

Select 
A.StoreNo 
A.LinearRegressionCalculation 

From (SubQuery) A 

La requête que j'utiliser pour obtenir les 6 semaines de l'historique des ventes est la suivante:

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] 
+0

Bien que vous pouvez faire des mathématiques dans SQL serveur, il est préférable de limiter cela aux opérations les plus simples - l'ajout et la comparaison, imo, sont les seuls qui en valent la peine. La régression linéaire est mathématique sur des sous-ensembles ordonnés, un genre de chose où une base de données relationnelle est particulièrement faible. Avez-vous vraiment besoin de le faire dans la base de données? Ne pouvez-vous pas l'insérer dans la couche application, utiliser une bibliothèque de statistiques correctement construite et simplement stocker le résultat? – Greenspark

+0

il vient de rendre la vie plus facile de le faire une requête, où comme dans Excel son très salissant, je l'ai résolu maintenant de toute façon si vous voulez voir la réponse ci-dessous – PeterH

Répondre

0

avaient calculé ce terme (bien que les résultats sont slighty sur 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