Bart
Bart

Reputation: 13

SQL Server Trigger: Update table with COUNT from another table

I am new to SQL. Trying to update a table with an ID and COUNT from another table. I need to get from Table1 ID, COUNT of ID, and most recent Date. Then update Table2 with ID, SUM, Date. Table1 (ID, VID, Date) PK = ID & VID Table2 (ID, SUM, Date)

CREATE TRIGGER Trigger1
  ON dbo.Table1
  AFTER INSERT, UPDATE, DELETE
AS
  UPDATE dbo.Table2
  SET SUM = (
     SELECT COUNT(ID)
     FROM dbo.Table1
);

I know this is very incomplete and does not include the ID, and Date. Any help would be appreciated! Thanks in advance.

Upvotes: 0

Views: 5399

Answers (2)

Anagha
Anagha

Reputation: 918

Try this -

CREATE TRIGGER Trigger1
      ON dbo.Table1
      AFTER INSERT, UPDATE, DELETE
    AS
    begin
    DECLARE @id int
    DECLARE @date datetime
    SET NOCOUNT ON
    select  @id =  id  FROM INSERTED
    set @date =  select max(date)  FROM table1

      UPDATE dbo.Table2
      SET SUM =  a.sum
          from
         (SELECT COUNT(ID) as sum,id
         FROM dbo.Table1
         group by id) a
         where a.id = table2.id
         and  Table2.date = @date
         where a.id = table2.id;
     end

Upvotes: 1

Jason A. Long
Jason A. Long

Reputation: 4442

I'm guessing that you're looking for something like this...

USE tempdb;
GO

-- Start by creating a couple of tables in tempdb...
CREATE TABLE dbo.OrderHeader (
    OrderID INT NOT NULL,
    DetailCount INT NOT NULL
        CONSTRAINT df_OrderHeader_DetailCount DEFAULT (0),
    CONSTRAINT pk_OrderHeader_OrderID PRIMARY KEY CLUSTERED (OrderID)
    );
GO

INSERT dbo.OrderHeader(OrderID) VALUES 
    (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),
    (11),(12),(13),(14),(15),(16),(17),(18),(19),(20),
    (21),(22),(23),(24),(25),(26),(27),(28),(29),(30);
GO

CREATE TABLE dbo.OrderDetails (
    OrderDetailID INT NOT NULL IDENTITY(1,1),
    OrderID INT NOT NULL 
        CONSTRAINT fk_OrderHeader_OrderID FOREIGN KEY REFERENCES dbo.OrderHeader (OrderID)
            ON UPDATE CASCADE ON DELETE CASCADE,
    Quantity INT NOT NULL 
        CONSTRAINT df_OrderDetails_Quantity DEFAULT (1)
        CONSTRAINT ck_OrderDetails_Quantity CHECK (Quantity > 0)
    CONSTRAINT pk_OrderDetails_OrderID PRIMARY KEY CLUSTERED (OrderDetailID)
    );
GO

-- create a nonclustered index on dbo.OrderDetails.OrderID so that the trigger has the ability to do a seek operation.
CREATE NONCLUSTERED INDEX ix_OrderDetails_OrderID ON dbo.OrderDetails (OrderID);

-- Create an AFTER trigger on dbo.OrderDetails that will update dbo.OrderHeader after ever insert.
CREATE TRIGGER tr_UpdateDetailCount ON dbo.OrderDetails
AFTER INSERT 
AS 
BEGIN 
    UPDATE oh SET
        oh.DetailCount = odx.DetailCount
    FROM
        dbo.OrderHeader oh
        JOIN Inserted i
            ON oh.OrderID = i.OrderID
        CROSS APPLY (
                    SELECT 
                        DetailCount = COUNT(1)
                    FROM
                        dbo.OrderDetails od
                    WHERE 
                        oh.OrderID = od.OrderID
                    ) odx;
END;
GO 

-- Insert some values into dbo.OrderDetails...
INSERT dbo.OrderDetails(OrderID, Quantity)
SELECT TOP 10000
    ABS(CHECKSUM(NEWID())) % 30 + 1,
    ABS(CHECKSUM(NEWID())) % 5 + 1
FROM
    dbo.tfn_Tally(200, 1) t

--======================================

-- Check to see that the trigger has worked as expected...
SELECT * FROM dbo.OrderHeader oh;
SELECT * FROM dbo.OrderDetails od;

--======================================

-- And cleanup...
DROP TABLE dbo.OrderDetails;
DROP TABLE dbo.OrderHeader;

dbo.OrderHeader after the insert into dbo.OrderDetails

OrderID     DetailCount
----------- -----------
1           5
2           10
3           5
4           15
5           4
6           6
7           7
8           7
9           9
10          11
11          6
12          6
13          3
14          6
15          2
16          7
17          8
18          6
19          5
20          8
21          6
22          6
23          6
24          11
25          12
26          7
27          4
28          5
29          1
30          6

Upvotes: 0

Related Questions