将新的计算列(上周平均销售额 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;
但是请注意,这需要每周每个产品的连续/连续行(无间隙)。
您可以添加引用 FUNCTION
的 COMPUTED 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])
我有 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;
但是请注意,这需要每周每个产品的连续/连续行(无间隙)。
您可以添加引用 FUNCTION
的 COMPUTED 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])