【问题标题】:update summary table from detail table从明细表更新汇总表
【发布时间】:2014-01-08 21:02:31
【问题描述】:

我有 2 个名为

的表
PROD_DET 
( ID , PROD_SUMM_ID, TRANS_DATE,  EMP_ID,  PROC_ID ,  PCS)

PROD_SUMM
( ID , TRANS_DATE,  EMP_ID,  PROC_ID ,  PCS)

现在每当一条记录插入到 PROD_DET 表中时,

我想Insert(如果唯一的 TRANS_DATE、EMP_ID、PROC_ID 的记录不可用)/Update(如果唯一的 TRANS_DATE、EMP_ID、PROC_ID 的记录可用)在我的PROD_SUMM表格,

  1. 来自 PROD_DET 的唯一 TRANS_DATE 表应该放到PROD_SUMM表的TRANS_DATE中,

  2. 唯一的 EMP_ID 和唯一的 PROC_ID 应该进入它们的 相应的列 在 PROD_SUMM 表中

  3. 特定 TRANS_DATE 的多个记录的 PCS 总和应在 PROD_SUMM 表中的 PCS 列
  4. PROD_SUMM 表中的 ID 应更新为 PROD_SUMM_ID 列 PROD_DET 表

我尝试过使用触发器,但没有达到目标, 找到下面的屏幕截图

创建表格的脚本 ~~~~~~~~~~~~~~~~~~~~~~

CREATE TABLE [dbo].[PROD_DET](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [PROD_SUMM_ID] [int] NULL,
    [TRAN_DATE] [date] NOT NULL,
    [EMP_ID] [int] NOT NULL,
    [PROC_ID] [int] NOT NULL,
    [PCS] [smallint] NOT NULL, 
CONSTRAINT [PK_PROD_DET] PRIMARY KEY CLUSTERED 
( [ID] ASC ) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY] ) ON [PRIMARY]

CREATE TABLE [dbo].[PROD_SUMM](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [TRAN_DATE] [date] NOT NULL,
    [EMP_ID] [int] NOT NULL,
    [PROC_ID] [int] NOT NULL,
    [PCS] [int] NOT NULL, 
CONSTRAINT [PK_PROD_SUMM] PRIMARY KEY CLUSTERED 
( [ID] ASC )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY] ) ON [PRIMARY]

【问题讨论】:

    标签: sql-server sql-server-2008 triggers merge


    【解决方案1】:

    看粗略的工作。有任何问题。

       Declare @tbl table([ID] [int] IDENTITY(1,1) NOT NULL,[TRAN_DATE] [date] NOT NULL,[EMP_ID] [int] NOT NULL,[PROC_ID] [int] NOT NULL,[PCS] [int] NOT NULL)
    
    insert into PROD_DET
    output inserted.TRANS_DATE,  inserted.EMP_ID,  inserted.PROC_ID ,  inserted.PCS into @tbl
    values() -- for PROD_DET
    
    merge  PROD_SUMM as target
    using select id,b.TRAN_DATE,b.PCS,a.EMP_ID,a.PROC_ID from @tbl a inner join
    (select TRAN_DATE,sum(PCS) PCS from @tbl group by TRAN_DATE) b on a.TRAN_DATE=b.TRAN_DATE) as source
    on  target.TRANS_DATE=source.TRANS_DATE and target.EMP_ID=source.EMP_ID and target.PROC_ID =source.EMP_ID
    when matched then
    update
     set TRAN_DATE=source.TRAN_DATE,EMP_ID=source.EMP_ID,PROC_ID=source.PROC_ID,PCS=source.PCS
    when not matched then
    insert (TRAN_DATE,EMP_ID,PROC_ID,PCS) 
    values(source.TRAN_DATE,source.EMP_ID,source.PROC_ID,source.PCS)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      相关资源
      最近更新 更多