如何使用T-SQL关联两组不同的数据?

时间:2016-08-22 02:14:16

标签: sql-server tsql sql-server-2012

由于我的问题很冗长,所以让我们快速跳进去:

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但我还是无法正常加入。

你能帮助我得到以下结果吗?

(我无法在这里正确地格式化结果,因此我为此添加了图像。)

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

1 个答案:

答案 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

如果您对此有用,或者您有任何疑问,请告诉我