2013-04-22 35 views
1

我有一个查询,该查询根据供应商为本月提供Inventory Dollars。我有一个保留了历史数据的Inventory_Summary表。我希望查询能够更新Inventory_Summary表中最新的月份数据。这里是查询需要将需要进入Inventory_Summary表格的库存数据。在单独的TABLE上更新SELECT查询的单独TABLE中的字段

SELECT 
    Vendor, 
    SUM(Cost*QOH) AS InvDlr 
FROM 
    dbo.Inventory 
WHERE 
    Division NOT IN ('9999') 
AND 
    Class NOT IN ('5500') 
AND 
    Vendor IN ('AA','BB','CC','DD','EE') 
GROUP BY 
    Vendor 

我需要这个结果集进入的结构是这样的表格:

Inventory_Summary 

Vendor 
Vendor_Name 
MonthNum 
Year 
InvDlr 

我怎么能每日更新的最新数据当月?

+1

您上次修改日期的库存表中是否有任何日期列? – Sachin 2013-04-22 20:29:23

+0

对于月份和年份,假设只是今天的日期(即查询运行时)?此外,是“MonthNum”1为基础的,即1-12?看起来你也可能一次更新多行,对于每个供应商? – mellamokb 2013-04-22 20:32:03

+0

您正在使用哪种RDBMS? SQL Server?如果是这样,请使用该版本标记它。 – mellamokb 2013-04-22 20:33:30

回答

1

做一个UPDATE从一个表到另一个是相当简单的,使用的UPDATE Table SET fields FROM Joined Tables模式:

UPDATE S 
SET S.InvDlr = I.InvDlr 
FROM (SELECT 
      Vendor, 
      SUM(Cost*QOH) AS InvDlr 
     FROM 
      dbo.Inventory 
     WHERE 
      Division NOT IN ('9999') 
     AND 
      Class NOT IN ('5500') 
     AND 
      Vendor IN ('AA','BB','CC','DD','EE') 
     GROUP BY 
      Vendor) I 
JOIN Inventory_Summary S on I.Vendor = S.Vendor 
WHERE S.MonthNum = MONTH(GETDATE()) 
    AND S.Year = YEAR(GETDATE()) 

在这个例子中,我干脆放弃了SELECT你在一个子查询,并提供给它的别名I。然后通过Vendor字段将其加入Inventory_Summary。最后,InvDlr字段被设置为子查询中的金额。此外,Inventory_Summary表仅针对当前的月份和年份进行过滤。

演示:http://www.sqlfiddle.com/#!3/2e663/1(我离开DivisionClass场,但不应该影响演示)。

+0

删除我的MonthNum数据为'4'的值 – tsqln00b 2013-04-22 20:50:27

+0

我认为这是因为我有MonthNum和Year以及文本和非数字字段。 – tsqln00b 2013-04-22 21:19:31

+0

您可以相对容易地将数字转换为文本:'CAST(MONTH(GETDATE())AS VARCHAR(2))'。反之亦然:'CAST(S.MonthNum AS INTEGER)'。 – mellamokb 2013-04-22 21:57:59

相关问题