Sql 将新的计算列(最近4周的平均销售额)添加到现有表中

Sql 将新的计算列(最近4周的平均销售额)添加到现有表中,sql,sql-server,calculated-columns,Sql,Sql Server,Calculated Columns,我把桌子放好了: SSID发行版ProdName发行版BranchID发行版salesQty weekID 1,产品,1,7,1434,10 2,产品,2,7,1223,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 Distri

我把桌子放好了:

SSID发行版ProdName发行版BranchID发行版salesQty weekID

1,产品,1,7,1434,10

2,产品,2,7,1223,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 District ProdName DistrictBranchID distrID salesQty weekID AvSales4LastW代码1代码2代码3

一,;产品1;7.1.434; 10; 108,5; 产品17110;产品1719;产品1718;产品1717

二,;产品2;7.1.223; 10; 55,75; 产品27110;产品2719;产品2718;产品2717

三,;产品1;7.1.23; 11; 114,25; 产品17111;产品17110;产品1719;产品1718

四,;产品2;7.1.23; 11; 61,5; 产品27111;产品27110;产品;2719产品2718

五,;产品1;7.1.43; 12; 125; 产品17112;产品17111;产品17110;产品1719

六,;产品2;7.1.12; 12; 64,5; 产品27112;产品27111;产品27110;产品2719

七,;产品1;7.1.232; 13; 183; 产品17113;产品17112;产品17111;产品17110

八,;产品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)? 抱歉,我无法添加图像

请帮帮我

有什么想法吗


谢谢

据我所知,您将无法向表中添加计算列,这会导致表中的前几行出现问题。但是,您可以使用分区上的平均值(按周数排序)来导出,例如:

SELECT *, avg(salesQty) over (partition by distrProdName order by weekID 
          ROWS between 3 preceding and current row) AS AvSales4LastW
FROM MyTable;
但是请注意,这需要每周为每个产品提供一个连续/连续的行(无间隙)


据我所知,您将无法向表中添加计算列,这会导致表中的前几行出现问题。但是,您可以使用分区上的平均值(按周数排序)来导出,例如:

SELECT *, avg(salesQty) over (partition by distrProdName order by weekID 
          ROWS between 3 preceding and current row) AS AvSales4LastW
FROM MyTable;
但是请注意,这需要每周为每个产品提供一个连续/连续的行(无间隙)


您可以添加一个引用
函数的
计算列
,以导出结果。以下是这项工作的样板:

测试数据:

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
更改表格:

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

您可以添加引用
函数的
计算列
,以导出结果。以下是这项工作的样板:

测试数据:

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
更改表格:

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、分行、城市、周末,则可以使用此功能:

功能:

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
更改表格:

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

如果您有不同的ProdName、分行、城市、周末,则可以使用此功能:

功能:

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
更改表格:

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

请您用文字描述一下(它在看什么字段,在什么时间范围内,等等),计算列应该是什么?我无法跟踪您的Excel转储。您是否想要一个运行/窗口平均值-例如,第10周将包括7、8、9和10,第11周将是8-11,等等?是的,第10周包括总销售额10、9、8、7,并除以4,例如,按产品划分的销售额2:13周=47 kUSD,12周=12 kUSD,11周=23 kUSD,10周223 kUSD;AvSales4LastW(13周,产品2)=(47+12+23+223)/4=76,25 kUSD(最近4周的平均销售额)您能用文字描述一下(它正在查看哪些字段,在什么时间范围内等),计算列应该是什么吗?我无法跟踪您的Excel转储。您是否想要一个运行/窗口平均值-例如,第10周将包括7、8、9和10,第11周将是8-11,等等?是的,第10周包括总销售额10、9、8、7,并除以4,例如,按产品划分的销售额2:13周=47 kUSD,12周=12 kUSD,11周=23 kUSD,10周223 kUSD;AvSales4LastW(13周,产品2)=(47+12+23+223)/4=76,25 kUSD(最近4周的平均销售额)还请注意,如果有更早的几周,则无法返回四周的平均值。它将返回存在的平均值。因此,如果前几周为零,它将返回当前一周。如果前一周有1个,则返回前一周和当前周的平均值。等等……是的,虽然这应该是平均值的“正确”值,例如,如果一家初创公司只有一个月的销售数据,那么过去6个月的月平均值必须近似于唯一的实际交易月。StuartLC,感谢您的帮助,以及如何将结果添加到现有表中?我认为最好的方法是简单地使用Stuart的代码创建一个视图,并简单地在该视图上运行查询。没有办法让它成为计算列。你可以使用像Siyual这样的函数,但我感觉性能会很糟糕。最好也是最简单的方法是创建一个视图。它需要长时间计算,我每周有超过1百万行。如何对此进行优化?还要注意,如果有更早的几周,那么它无法返回四周的平均值。它将返回存在的平均值。因此,如果前几周为零,它将返回当前一周。如果前一周有1个,则返回前一周和当前周的平均值。等等……是的,尽管这应该是平均值的“正确”值,例如,如果只有初创公司