我有2个表,一个名为 AcreMultiplier ,另一个名为 Land 。我正在尝试创建计算以填充名为分配的第三个表。
为了更好地理解,Land表包含MapTaxLots(MapTaxIDs),它是一块土地。然后,我有客户可以拥有许多这些MapTaxLots。每个MapTaxLot都能够包含不同类型的Acres,例如KID,KBID,Warren,GroupE,CalD和Rent。每种类型的英亩都有相关的数量。
每种类型的英亩在AcreMultiplier表中都有一个乘数。该乘数将用于为每个客户创建总分配。
计算需要遍历每个MapTaxID并将每种类型的英亩(KID,KBID,Warren,GroupE,CalD和Rent)乘以AcreMultiplier表中的乘数。但是,我需要将每个客户的整个等式加起来作为Allotment表的总Allotmnet。我的整个查询现在应插入CustomerID和Allotment。
我目前尝试过这样的事情,但我不熟悉使用基于其他表的计算来插入数据。
如果你能提出任何想法,甚至帮助我解决当前的问题,我将非常感激。
感谢您的时间!
答案 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
。否则,该表可能会过时等等。