由于我的问题很冗长,所以让我们快速跳进去:
CREATE TABLE [dbo].[FinDayInfo] --Table to get Financial Year , Month and Week information against a date
(
[CalDate] [date],
[WeekNo] [numeric] (18, 0),
[FinYear] [numeric] (18, 0),
[FinMM] [int]
)
INSERT INTO [dbo].[FinDayInfo] ( [CalDate] ,[WeekNo] ,[FinYear] ,[FinMM] )
VALUES ('2016-06-27' , 1 , 2017 , 1)
INSERT INTO [dbo].[FinDayInfo] ( [CalDate] ,[WeekNo] ,[FinYear] ,[FinMM] )
VALUES ('2016-08-03' , 6 , 2017 , 2)
INSERT INTO [dbo].[FinDayInfo] ( [CalDate] ,[WeekNo] ,[FinYear] ,[FinMM] )
VALUES ('2016-08-08' , 7 , 2017 , 2)
INSERT INTO [dbo].[FinDayInfo] ( [CalDate] ,[WeekNo] ,[FinYear] ,[FinMM] )
VALUES ('2016-08-15' , 8 , 2017 , 2)
CREATE TABLE [dbo].[Act] --Accounts table having Financial Week and Shop-wise data
(
[FinYear] [int],
[FinMonth] [int],
[FinWeek] [int],
[ShopCode] [int],
[ActVal] [decimal] (18, 6)
)
INSERT INTO [dbo].[ACT] ( [FinYear] ,[FinMonth] ,[FinWeek] ,[ShopCode] ,[ActVal] )
VALUES ( 2017, 1 , 2 , 1234 , 10)
INSERT INTO [dbo].[ACT] ( [FinYear] ,[FinMonth] ,[FinWeek] ,[ShopCode] ,[ActVal] )
VALUES ( 2017 , 1 , 3 , 1234 , 50)
INSERT INTO [dbo].[ACT] ( [FinYear] ,[FinMonth] ,[FinWeek] ,[ShopCode] ,[ActVal] )
VALUES ( 2017 , 1 , 4 , 1234 , 40)
INSERT INTO [dbo].[ACT] ( [FinYear] ,[FinMonth] ,[FinWeek] ,[ShopCode] ,[ActVal] )
VALUES ( 2017 , 1 , 5 , 1234 , 20)
INSERT INTO [dbo].[ACT] ( [FinYear] ,[FinMonth] ,[FinWeek] ,[ShopCode] ,[ActVal] )
VALUES ( 2017 , 2 , 6 , 1234 , 100)
INSERT INTO [dbo].[ACT] ( [FinYear] ,[FinMonth] ,[FinWeek] ,[ShopCode] ,[ActVal] )
VALUES ( 2017 , 2 , 7 , 5678 , 90)
INSERT INTO [dbo].[ACT] ( [FinYear] ,[FinMonth] ,[FinWeek] ,[ShopCode] ,[ActVal] )
VALUES ( 2017 , 2 , 8 , 1290 , 100)
CREATE TABLE [dbo].[Sal] --Sales data table
(
[SalDate] [Date],
[ShopCode] [int],
[ItemCode] [nvarchar](10),
[SaleVal] [decimal] (18,6)
)
INSERT INTO [dbo].[Sal] ( [SalDate] , [ShopCode] , [ItemCode] , [SaleVal] )
VALUES ( '2016-06-27', 1234, '111PN' , 5 )
INSERT INTO [dbo].[Sal] ( [SalDate] , [ShopCode] , [ItemCode] , [SaleVal] )
VALUES ( '2016-08-03', 1234, '100AB' , 50 )
INSERT INTO [dbo].[Sal] ( [SalDate] , [ShopCode] , [ItemCode] , [SaleVal] )
VALUES ( '2016-08-03', 1234, '100BC' , 60 )
INSERT INTO [dbo].[Sal] ( [SalDate] , [ShopCode] , [ItemCode] , [SaleVal] )
VALUES ( '2016-08-03', 1234, '110JK' , 40 )
INSERT INTO [dbo].[Sal] ( [SalDate] , [ShopCode] , [ItemCode] , [SaleVal] )
VALUES ( '2016-08-08', 5678, '122AB' , 90 )
INSERT INTO [dbo].[Sal] ( [SalDate] , [ShopCode] , [ItemCode] , [SaleVal] )
VALUES ( '2016-08-15', 1290, '111PN' , 35 )
INSERT INTO [dbo].[Sal] ( [SalDate] , [ShopCode] , [ItemCode] , [SaleVal] )
VALUES ( '2016-08-15', 1290, '123CD' , 35 )
根据这些数据,我需要如下结果(或附图)。
此数据的目的是每周获得调整价值项目和商店。此调整根据其销售贡献分配给每个项目。 “ActVal”是这方面的标准值,我们根据“ActVal”和“TotalSalePerShopAndWeek”的差异计算调整值。这样,如果我们将“TotalSalePerShopAndWeek”和“AdjustmentVal”的总和加起来,它应该等于“ActValPerShopAndWeek”。
所以为了关联这两个数据集,我尝试了CTE,Full Joins但我还是无法正常加入。
你能帮助我得到以下结果吗?
(我无法在这里正确地格式化结果,因此我为此添加了图像。)
FinYear FinMonth FinWeek ShopCode ItemCode SaleValPerWeekAndItem TotalSalePerShopAndWeek AdjustmentPercentage=(SaleValPerWeekAndItem / TotalSalePerShopAndWeek) ActValPerShopAndWeek AdjustmentValPerWeekAndItem= ((ActValPerShopAndWeek - TotalSalePerShopAndWeek) * AdjustmentPercentage)#[enter image description here][2]
2017 1 1 1234 111PN 5 5 1 0 -5
2017 1 2 1234 111PN 0 0 0 10 10
2017 1 3 1234 111PN 0 0 0 50 50
2017 1 4 1234 111PN 0 0 0 40 40
2017 1 5 1234 111PN 0 0 0 20 20
2017 2 6 1234 100AB 50 150 0.333333 100 -16.66665
2017 2 6 1234 100BC 60 150 0.4 100 -20
2017 2 6 1234 110JK 40 150 0.266666 100 -13.133333
2017 2 7 5678 122AB 90 90 1 90 90
2017 2 8 1290 111PN 35 70 0.50 90 15
2017 2 8 1290 123CD 35 70 0.50
90 15
答案 0 :(得分:0)
以下内容应该为您提供所需
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
select FinYear
, [FinMonth]
, [FinWeek]
, [Act].[ShopCode]
, Sal.ItemCode
, Sal.SaleVal
, Totals.Value
, Sal.SaleVal / Totals.Value
, Act.ActVal
, ((Act.ActVal - Totals.Value) * (Sal.SaleVal / Totals.Value))
from [Act]
LEFT JOIN [Sal] on Sal.ShopCode = Act.ShopCode
OUTER APPLY(SELECT SUM(SaleVal) as Value
FROM Sal as TotalSal
WHERE TotalSal.ShopCode = Act.ShopCode
) as Totals
ORDER BY Act.ShopCode
,Sal.ItemCode
,FinWeek
如果您对此有用,或者您有任何疑问,请告诉我