Sql server 根据多个表中的计算填充表

Sql server 根据多个表中的计算填充表,sql-server,Sql Server,我有两个表,一个叫做AcreMultiplier,另一个叫做Land。我正在尝试创建计算以填充第三个名为分配的表 为了更好地理解,土地表包含MapTaxLots(MapTaxIDs),这是土地的一部分。然后,我的客户可以拥有许多这样的MapTaxlot。每个MapTaxLot都可以容纳不同类型的英亩,如KID、KBID、Warren、GroupE、CalD和Rent。每种类型的英亩也有相应的数量 每种类型的acre在AcreMultiplier表中都有一个乘数。此乘数将用于为每个客户创建总分配

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

为了更好地理解,土地表包含MapTaxLots(MapTaxIDs),这是土地的一部分。然后,我的客户可以拥有许多这样的MapTaxlot。每个MapTaxLot都可以容纳不同类型的英亩,如KID、KBID、Warren、GroupE、CalD和Rent。每种类型的英亩也有相应的数量

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

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

我目前尝试过类似的方法,但我不熟悉使用基于其他表的计算插入数据

如果您能提出任何建议,甚至帮助我解决当前的问题,我将非常感谢


谢谢你抽出时间

最好将
土地
表分为两个单独的表:第一个表中CustomerID与每个MapTaxID关联,第二个表中CustomerID与每个MapTaxID的英亩类型/数量相关。那么,解决方案就简单多了

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

我们可以取消PIVOT
Land
(即取每个
AcresAmount
列并为每个列“创建”一行)并连接到
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]

假设数据不太大,最好只运行此查询或创建一个
视图
,而不是填充一个新的
。否则,桌子可能会过时,等等。

这里有一个提问的方法:我是新来的。这对我一点帮助都没有。波斯特说:提供一些样本测试数据,以及您至少尝试过的内容和输出内容。如果您查看我的照片链接,您会看到我这样做了。我们无法将照片复制并粘贴到自己的工具中,因此照片通常对我们没有用处。您的问题,包括作为文本的数据,我们可以复制粘贴和操纵。(理想情况下,把它放在
{}
代码块中以保持表格布局)你绝对是个了不起的人!unpivot函数正是我所需要的!我从未做过这样的函数。非常感谢。有没有办法让我收到你的电子邮件?我需要创建一个类似于上一个函数的函数,在这个函数中我将其插入到空表中。然后我需要在我的ASP.net web应用程序中实现此功能,以便每次更改乘数时都可以插入。@Cels-确实需要填充表吗?你能换一个新的吗?视图将查询保存为“虚拟表”,您可以从中进行选择。这样做的好处是,如果基础表(
Land
AcreMultiplier
)中的数据发生更改,视图将自动更改,因为它只是一个查询。是的,不幸的是,我必须以这种方式从该数据计算新值。每年都会从ASP.net web应用程序中删除并重新创建分配表。
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]