2016-08-22 17 views
2

由於我的問題是一個漫長的,所以讓我們快速跳進去:如何使用T-SQL關聯兩組不同的數據集?

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) 

從這個數據,我需要(或附圖片)效果如下。

此數據的目的是在每週獲得調整值項目和Shop-wise。該調整根據其銷售貢獻分配給每個項目。 「ActVal」是這方面的標準值,我們根據「ActVal」和「TotalSalePerShopAndWeek」的差異來計算調整值。這樣,如果我們合計「TotalSalePerShopAndWeek」和「AdjustmentVal」的總和,它應該等於「ActValPerShopAndWeek」。

因此,要關聯這兩個數據集,我嘗試了CTE,完全連接,但我一直無法正確加入它。

你能幫助我得到低於結果嗎?

(我無法在此處正確格式化結果,因此我爲此附加了圖片)。

enter image description here

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

謝謝Ranjana爲更正,但尋找解決方案以及:) – Kamran

+0

你能定義英文關係嗎?我猜FinDayInfo涉及按年和周的行爲,並且該法與ShopCode的Sal有關。那是對的嗎?完成了嗎? (對我來說這似乎不完整) – DeadZone

+0

爲什麼第1周沒有出現在法案表中? –

回答

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 

讓我知道,如果這是你有幫助,或者如果您有任何疑問