从多个表的计算中填充的表

时间:2016-02-17 08:45:31

标签: sql-server

我有2个表,一个名为 AcreMultiplier ,另一个名为 Land 。我正在尝试创建计算以填充名为分配的第三个表。

为了更好地理解,Land表包含MapTaxLots(MapTaxIDs),它是一块土地。然后,我有客户可以拥有许多这些MapTaxLots。每个MapTaxLot都能够包含不同类型的Acres,例如KID,KBID,Warren,GroupE,CalD和Rent。每种类型的英亩都有相关的数量。

Land Table

每种类型的英亩在AcreMultiplier表中都有一个乘数。该乘数将用于为每个客户创建总分配。

计算需要遍历每个MapTaxID并将每种类型的英亩(KID,KBID,Warren,GroupE,CalD和Rent)乘以AcreMultiplier表中的乘数。但是,我需要将每个客户的整个等式加起来作为Allotment表的总Allotmnet。我的整个查询现在应插入CustomerID和Allotment。

我目前尝试过这样的事情,但我不熟悉使用基于其他表的计算来插入数据。

My current query

如果你能提出任何想法,甚至帮助我解决当前的问题,我将非常感激。

感谢您的时间!

1 个答案:

答案 0 :(得分:0)

最好将Land表拆分为两个单独的表:第一个CustomerID与每个MapTaxID相关联,第二个表示每个MapTaxID具有的Acres类型/数量。然后,解决方案要简单得多。

但是,如果您无法做到这一点,那么这里有一个适合您的解决方案(假设您使用的是SQL Server 2005或更高版本):

-- Recreate your tables
CREATE TABLE #Land 
  (
     [CustomerID]        INT NOT NULL,
     [MapTaxID]          INT IDENTITY(1, 1) NOT NULL,
     [AcresAmountKID]    DECIMAL(10, 2) NOT NULL DEFAULT(0),
     [AcresAmountKBID]   DECIMAL(10, 2) NOT NULL DEFAULT(0),
     [AcresAmountWarren] DECIMAL(10, 2) NOT NULL DEFAULT(0),
     [AcresAmountGroupE] DECIMAL(10, 2) NOT NULL DEFAULT(0),
     [AcresAmountCalD]   DECIMAL(10, 2) NOT NULL DEFAULT(0),
     [AcresAmountRent]   DECIMAL(10, 2) NOT NULL DEFAULT(0)
  )
CREATE TABLE #AcreMultiplier
  (
     [AcreTypeID]       VARCHAR(20) NOT NULL,
     [MultiplierAmount] DECIMAL(10, 2) NOT NULL
  )

-- Populate with random data
INSERT INTO #Land
            ([CustomerID],
             [AcresAmountKID],
             [AcresAmountKBID],
             [AcresAmountWarren],
             [AcresAmountGroupE],
             [AcresAmountCalD],
             [AcresAmountRent])
VALUES      (1,RAND() * 30,RAND() * 30,RAND() * 30,RAND() * 30,RAND() * 30,RAND() * 30),
            (2,RAND() * 30,RAND() * 30,RAND() * 30,RAND() * 30,RAND() * 30,RAND() * 30),
            (2,RAND() * 30,RAND() * 30,RAND() * 30,RAND() * 30,RAND() * 30,RAND() * 30),
            (2,RAND() * 30,RAND() * 30,RAND() * 30,RAND() * 30,RAND() * 30,RAND() * 30),
            (2,RAND() * 30,RAND() * 30,RAND() * 30,RAND() * 30,RAND() * 30,RAND() * 30),
            (3,RAND() * 30,RAND() * 30,RAND() * 30,RAND() * 30,RAND() * 30,RAND() * 30),
            (3,RAND() * 30,RAND() * 30,RAND() * 30,RAND() * 30,RAND() * 30,RAND() * 30)

INSERT INTO #AcreMultiplier
            ([AcreTypeID],
             [MultiplierAmount])
VALUES      ('KID',RAND() * 5),
            ('KBID',RAND() * 5),
            ('Warren',RAND() * 5),
            ('GroupE',RAND() * 5),
            ('CalD',RAND() * 5),
            ('Rent',RAND() * 5)

-- Let's see what we have
SELECT *
FROM   #Land

SELECT *
FROM   #AcreMultiplier

我们可以UNPIVOT Land(即,每个AcresAmount列,"为每个列创建一行#34)并加入AcreMultiplier

SELECT upvt.[CustomerID],
       upvt.[MapTaxID],
       [Allotment] = SUM(upvt.[AcreAmount] * am.[MultiplierAmount])
FROM   #Land l
       UNPIVOT ( [AcreAmount]
               FOR [AcreTypeID] IN ([AcresAmountKID],
                                    [AcresAmountKBID],
                                    [AcresAmountWarren],
                                    [AcresAmountGroupE],
                                    [AcresAmountCalD],
                                    [AcresAmountRent])) upvt
       JOIN #AcreMultiplier am
         ON REPLACE(upvt.[AcreTypeID], 'AcresAmount', '') = am.[AcreTypeID]
GROUP  BY upvt.[CustomerID],
          upvt.[MapTaxID] 


SELECT upvt.[CustomerID],
       [Allotment] = SUM(upvt.[AcreAmount] * am.[MultiplierAmount])
FROM   #Land l
       UNPIVOT ( [AcreAmount]
               FOR [AcreTypeID] IN ([AcresAmountKID],
                                    [AcresAmountKBID],
                                    [AcresAmountWarren],
                                    [AcresAmountGroupE],
                                    [AcresAmountCalD],
                                    [AcresAmountRent])) upvt
       JOIN #AcreMultiplier am
         ON REPLACE(upvt.[AcreTypeID], 'AcresAmount', '') = am.[AcreTypeID]
GROUP  BY upvt.[CustomerID]

假设您的数据不是太大,最好只是运行此查询或创建VIEW而不是填充新的TABLE。否则,该表可能会过时等等。