将新的计算列(上周平均销售额 4)添加到现有 table

Add new calculate column (Average Sales 4 last weeks) to an existing table

我有 Table:

SSID distrProdName distrBranchID distrID salesQty weekID

1, 产品, 1, 7, 1, 434, 10

2, 产品, 2, 7, 1, 223, 10

3, 产品, 1, 7, 1, 23, 11

4,产品,2、7、1、23、11

5,产品,1、7、1、43、12

6, 产品, 2, 7, 1, 12, 12

7, 产品, 1, 7, 1, 232, 13

8,产品,2、7、1、47、13

我想添加一个新的计算列"AvSales4LastW"

在 MS Excel 我是这样解决的:

SSID distrProdName distrBranchID distrID salesQty weekID AvSales4LastW code code1 code2 code3

1;产品1; 7; 1; 434; 10; 108,5;产品 17110;产品 1719;产品 1718;产品 1717

2;产品2; 7; 1; 223; 10; 55,75;产品 27110;产品 2719;产品 2718;产品 2717;

3;产品1; 7; 1; 23; 11; 114,25;产品 17111;产品 17110;产品 1719;产品 1718;

4;产品2; 7; 1; 23; 11; 61,5;产品 27111;产品 27110;产品; 2719 产品 2718;

5;产品1; 7; 1; 43; 12; 125;产品 17112;产品 17111;产品 17110;产品 1719;

6;产品2; 7; 1; 12; 12; 64,5;产品 27112;产品 27111;产品 27110;产品 2719;

7;产品1; 7; 1; 232; 13; 183;产品 17113;产品 17112;产品 17111;产品 17110;

8;产品2; 7; 1; 47; 13; 76,25;产品 27113;产品 27112;产品 27111;产品 27110;

H9 中的公式:=B9&C9&D9&F9

I9 中的公式:=B9&C9&D9&F9-1

J9中的公式:=B9&C9&D9&F9-2

K9中的公式:=B9&C9&D9&F9-3

AvSales4LastW(G9) = 平均值(E9;SUMIF($H:$H;$I9;$E:$E);SUMIF($H:$H; $J9;$E:$E);SUMIF($H:$H;$K9;$E:$E)) = (47+12+23+223)/4 = 76,25

如何在 MS SQL SERVER 中添加新列 (AvSales4LastW)? 抱歉,我无法添加图片

请帮帮我

任何想法

谢谢

据我所知,您将无法将 COMPUTED 列添加到 table,这是 table 中先前行的原因。但是,您可以使用分区的平均值得出 rolling average,按周数排序,例如:

SELECT *, avg(salesQty) over (partition by distrProdName order by weekID 
          ROWS between 3 preceding and current row) AS AvSales4LastW
FROM MyTable;

但是请注意,这需要每周每个产品的连续/连续行(无间隙)。

SqlFiddle here

您可以添加引用 FUNCTIONCOMPUTED COLUMN 来导出结果。这是此工作的示例模型:

测试数据:

Create Table TestComputed
(
    PK int not null identity(1,1),
    ProductName Varchar (100),
    B int,
    C int,
    Qty int,
    Wk int
)
Go

Insert TestComputed (ProductName, B, C, Qty, Wk)
Values  ('1', 7, 1, 434, 10),
        ('2', 7, 1, 223, 10),
        ('1', 7, 1, 23, 11),
        ('2', 7, 1, 23, 11),
        ('1', 7, 1, 43, 12),
        ('2', 7, 1, 12, 12),
        ('1', 7, 1, 232, 13),
        ('2', 7, 1, 47, 13)

函数:

Create Function dbo.fnGet4WeekAverage(@WeekId Int, @ProductName Varchar (100))
Returns int
As Begin
    Declare @Average Int = 0

    Select  @Average = Avg(Qty)
    From    TestComputed
    Where   Wk Between @WeekId - 3 And @WeekId
    And     ProductName = @ProductName

    Return @Average
End
Go

改变Table:

Alter Table TestComputed Add AvSales4LastW As dbo.fnGet4WeekAverage(wk, ProductName)

结果:

Select * From TestComputed

PK  ProductName B   C   Qty Wk  AvSales4LastW
1   1           7   1   434 10  434
2   2           7   1   223 10  223
3   1           7   1   23  11  228
4   2           7   1   23  11  123
5   1           7   1   43  12  166
6   2           7   1   12  12  86
7   1           7   1   232 13  183
8   2           7   1   47  13  76

如果您有不同的 ProdName、Branch、City、WeekID,您可以使用此功能:

函数:

Create Function dbo.fnGet4WeekAverage(@ProductName nvarchar (150), @BranchName int, @DistrID int, @weekID Int)
Returns float
As Begin
    Declare @Average float = 0

    Select  @Average = Avg([salesQty])
    From    [dbo].[weeklySalesStocks]
    Where   [weekID] Between @weekID - 3 And @weekID
    And     [distrProdName] = @ProductName
    And     [distrBranchID] = @BranchName
    And     [distrID] = @DistrID 

    Return @Average
End
Go

改变table:

Alter Table [dbo].[weeklySalesStocks] Add AvSales4LastW As dbo.fnGet4WeekAverage([distrProdName], [distrBranchID], [distrID], [weekID])