AUDITID RECORDID EDITTABLE EDITDATE EDITUSER EDITFIELD EDITVALUE1 1 Computers 2012-09-29 10:10:14.547 Mike Brand Acme2 1 Computers 2012-09-29 10:10:14.547 Mike RAM 23 1 Computers 2012-09-29 10:10:14.547 Mike Colour Red4 2 Chairs 2012-09-29 10:23:52.132 Bob Brand Comfy5 2 Chairs 2012-09-29 10:23:52.132 Bob Colour Blue6 2 Chairs 2012-09-29 10:23:52.132 Bob Wheels 57 2 Chairs 2012-09-29 10:23:52.132 Bob Arms No8 3 Bottles 2012-09-29 11:19:23.424 Mike Capacity 3009 3 Bottles 2012-09-29 11:19:23.424 Mike Lid Yes10 1 Computers 2012-09-30 14:32:26.223 Mike Brand Something11 1 Computers 2012-09-30 14:32:26.223 Mike RAM 412 1 Computers 2012-09-30 14:32:26.223 Mike Colour Red13 4 Chairs 2012-10-01 08:47:39.353 Sarah Brand NotSoComfy14 4 Chairs 2012-10-01 08:47:39.353 Sarah Colour Blue15 4 Chairs 2012-10-01 08:47:39.353 Sarah Wheels 316 4 Chairs 2012-10-01 08:47:39.353 Sarah Arms Yes
DECLARE @t TABLE (col1 VARCHAR(10), col2 VARCHAR(10))INSERT INTO @tSELECT 'abc', 'def'UNION ALL SELECT 'ghi', 'klm'
CREATE TABLE #xxx (columns)-- or as I did:DECLARE @T TABLE (columns)
RecordID EditTable EditDate EditUser Brand RAM Colour Wheels Arms Capacity Lid2 Chairs 2012-09-29 10:23:52.000 Bob Comfy NULL NULL 5 No NULL NULL3 Bottles 2012-09-29 11:19:23.000 Mike NULL NULL NULL NULL NULL 300 Yes1 Computers 2012-09-30 14:32:26.000 Mike Something 4 Red NULL NULL NULL NULL4 Chairs 2012-10-01 08:47:39.000 Sarah NotSoComfy NULL Blue 3 Yes NULL NULL
CREATE TABLE [dbo].[m_Audit_Example]( [AuditID] [int] NULL, [RecordID] [int] NULL, [EditTable] [varchar](20) NULL, [EditDate] [datetime] NULL, [EditUser] [varchar](20) NULL, [EditField] [varchar](20) NULL, [EditValue] [varchar](20) NULL) ON [PRIMARY]GOINSERT [dbo].[m_Audit_Example] ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (1, 1, N'Computers', CAST(0x0000A0DB00A79C34 AS DateTime), N'Mike', N'Brand', N'Acme')INSERT [dbo].[m_Audit_Example] ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (2, 1, N'Computers', CAST(0x0000A0DB00A79C34 AS DateTime), N'Mike', N'RAM', N'2')INSERT [dbo].[m_Audit_Example] ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (3, 1, N'Computers', CAST(0x0000A0DB00A79C34 AS DateTime), N'Mike', N'Colour', N'Red')INSERT [dbo].[m_Audit_Example] ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (4, 2, N'Chairs', CAST(0x0000A0DB00AB59A0 AS DateTime), N'Bob', N'Brand', N'Comfy')INSERT [dbo].[m_Audit_Example] ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (5, 2, N'Chairs', CAST(0x0000A0DB00AB59A0 AS DateTime), N'Bob', N'Colour', N'Blue')INSERT [dbo].[m_Audit_Example] ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (6, 2, N'Chairs', CAST(0x0000A0DB00AB59A0 AS DateTime), N'Bob', N'Wheels', N'5')INSERT [dbo].[m_Audit_Example] ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (7, 2, N'Chairs', CAST(0x0000A0DB00AB59A0 AS DateTime), N'Bob', N'Arms', N'No')INSERT [dbo].[m_Audit_Example] ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (8, 3, N'Bottles', CAST(0x0000A0DB00BA9924 AS DateTime), N'Mike', N'Capacity', N'300')INSERT [dbo].[m_Audit_Example] ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (9, 3, N'Bottles', CAST(0x0000A0DB00BA9924 AS DateTime), N'Mike', N'Lid', N'Yes')INSERT [dbo].[m_Audit_Example] ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (10, 1, N'Computers', CAST(0x0000A0DC00EF9EF8 AS DateTime), N'Mike', N'Brand', N'Something')INSERT [dbo].[m_Audit_Example] ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (11, 1, N'Computers', CAST(0x0000A0DC00EF9EF8 AS DateTime), N'Mike', N'RAM', N'4')INSERT [dbo].[m_Audit_Example] ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (12, 1, N'Computers', CAST(0x0000A0DC00EF9EF8 AS DateTime), N'Mike', N'Colour', N'Red')INSERT [dbo].[m_Audit_Example] ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (13, 4, N'Chairs', CAST(0x0000A0DD0090EC64 AS DateTime), N'Sarah', N'Brand', N'NotSoComfy')INSERT [dbo].[m_Audit_Example] ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (14, 4, N'Chairs', CAST(0x0000A0DD0090EC64 AS DateTime), N'Sarah', N'Colour', N'Blue')INSERT [dbo].[m_Audit_Example] ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (15, 4, N'Chairs', CAST(0x0000A0DD0090EC64 AS DateTime), N'Sarah', N'Wheels', N'3')INSERT [dbo].[m_Audit_Example] ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (16, 4, N'Chairs', CAST(0x0000A0DD0090EC64 AS DateTime), N'Sarah', N'Arms', N'Yes')
CREATE TABLE [dbo].[m_Audit_Result_Example]( [RecordID] [int] NULL, [EditTable] [varchar](20) NULL, [EditDate] [datetime] NULL, [EditUser] [varchar](20) NULL, [Brand] [varchar](20) NULL, [RAM] [varchar](20) NULL, [Colour] [varchar](20) NULL, [Wheels] [varchar](20) NULL, [Arms] [varchar](20) NULL, [Capacity] [varchar](20) NULL, [Lid] [varchar](20) NULL) ON [PRIMARY]GOINSERT [dbo].[m_Audit_Result_Example] ([RecordID], [EditTable], [EditDate], [EditUser], [Brand], [RAM], [Colour], [Wheels], [Arms], [Capacity], [Lid]) VALUES (2, N'Chairs', CAST(0x0000A0DB00AB59A0 AS DateTime), N'Bob', N'Comfy', NULL, NULL, N'5', N'No', NULL, NULL)INSERT [dbo].[m_Audit_Result_Example] ([RecordID], [EditTable], [EditDate], [EditUser], [Brand], [RAM], [Colour], [Wheels], [Arms], [Capacity], [Lid]) VALUES (3, N'Bottles', CAST(0x0000A0DB00BA9924 AS DateTime), N'Mike', NULL, NULL, NULL, NULL, NULL, N'300', N'Yes')INSERT [dbo].[m_Audit_Result_Example] ([RecordID], [EditTable], [EditDate], [EditUser], [Brand], [RAM], [Colour], [Wheels], [Arms], [Capacity], [Lid]) VALUES (1, N'Computers', CAST(0x0000A0DC00EF9EF8 AS DateTime), N'Mike', N'Something', N'4', N'Red', NULL, NULL, NULL, NULL)INSERT [dbo].[m_Audit_Result_Example] ([RecordID], [EditTable], [EditDate], [EditUser], [Brand], [RAM], [Colour], [Wheels], [Arms], [Capacity], [Lid]) VALUES (4, N'Chairs', CAST(0x0000A0DD0090EC64 AS DateTime), N'Sarah', N'NotSoComfy', NULL, N'Blue', N'3', N'Yes', NULL, NULL)
CREATE TABLE #m_Audit_Example( [AuditID] [int] NULL, [RecordID] [int] NULL, [EditTable] [varchar](20) NULL, [EditDate] [datetime] NULL, [EditUser] [varchar](20) NULL, [EditField] [varchar](20) NULL, [EditValue] [varchar](20) NULL) ON [PRIMARY]GOINSERT #m_Audit_Example ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (1, 1, N'Computers', CAST(0x0000A0DB00A79C34 AS DateTime), N'Mike', N'Brand', N'Acme')INSERT #m_Audit_Example ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (2, 1, N'Computers', CAST(0x0000A0DB00A79C34 AS DateTime), N'Mike', N'RAM', N'2')INSERT #m_Audit_Example ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (3, 1, N'Computers', CAST(0x0000A0DB00A79C34 AS DateTime), N'Mike', N'Colour', N'Red')INSERT #m_Audit_Example ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (4, 2, N'Chairs', CAST(0x0000A0DB00AB59A0 AS DateTime), N'Bob', N'Brand', N'Comfy')INSERT #m_Audit_Example ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (5, 2, N'Chairs', CAST(0x0000A0DB00AB59A0 AS DateTime), N'Bob', N'Colour', N'Blue')INSERT #m_Audit_Example ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (6, 2, N'Chairs', CAST(0x0000A0DB00AB59A0 AS DateTime), N'Bob', N'Wheels', N'5')INSERT #m_Audit_Example ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (7, 2, N'Chairs', CAST(0x0000A0DB00AB59A0 AS DateTime), N'Bob', N'Arms', N'No')INSERT #m_Audit_Example ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (8, 3, N'Bottles', CAST(0x0000A0DB00BA9924 AS DateTime), N'Mike', N'Capacity', N'300')INSERT #m_Audit_Example ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (9, 3, N'Bottles', CAST(0x0000A0DB00BA9924 AS DateTime), N'Mike', N'Lid', N'Yes')INSERT #m_Audit_Example ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (10, 1, N'Computers', CAST(0x0000A0DC00EF9EF8 AS DateTime), N'Mike', N'Brand', N'Something')INSERT #m_Audit_Example ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (11, 1, N'Computers', CAST(0x0000A0DC00EF9EF8 AS DateTime), N'Mike', N'RAM', N'4')INSERT #m_Audit_Example ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (12, 1, N'Computers', CAST(0x0000A0DC00EF9EF8 AS DateTime), N'Mike', N'Colour', N'Red')INSERT #m_Audit_Example ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (13, 4, N'Chairs', CAST(0x0000A0DD0090EC64 AS DateTime), N'Sarah', N'Brand', N'NotSoComfy')INSERT #m_Audit_Example ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (14, 4, N'Chairs', CAST(0x0000A0DD0090EC64 AS DateTime), N'Sarah', N'Colour', N'Blue')INSERT #m_Audit_Example ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (15, 4, N'Chairs', CAST(0x0000A0DD0090EC64 AS DateTime), N'Sarah', N'Wheels', N'3')INSERT #m_Audit_Example ([AuditID], [RecordID], [EditTable], [EditDate], [EditUser], [EditField], [EditValue]) VALUES (16, 4, N'Chairs', CAST(0x0000A0DD0090EC64 AS DateTime), N'Sarah', N'Arms', N'Yes')SELECT * FROM #m_Audit_Example
;WITH MyAudits AS ( SELECT RecordID, EditTable, EditDate, EditUser, EditField, EditValue ,rn=ROW_NUMBER() OVER (PARTITION BY EditUser, EditTable, rn ORDER BY EditDate DESC) FROM ( SELECT RecordID, EditTable, EditDate, EditUser, EditField, EditValue ,rn=ROW_NUMBER() OVER (PARTITION BY EditUser, EditTable, EditDate ORDER BY RecordID DESC) FROM #m_Audit_Example) a ), MyGroups AS ( SELECT RecordID, EditTable, EditDate, EditUser ,Brand = CASE WHEN EditField = 'Brand' THEN MAX(EditValue) ELSE NULL END ,RAM = CASE WHEN EditField = 'RAM' THEN MAX(EditValue) ELSE NULL END ,Colour = CASE WHEN EditField = 'Colour' THEN MAX(EditValue) ELSE NULL END ,Wheels = CASE WHEN EditField = 'Wheels' THEN MAX(EditValue) ELSE NULL END ,Arms = CASE WHEN EditField = 'Arms' THEN MAX(EditValue) ELSE NULL END ,Capacity=CASE WHEN EditField = 'Capacity' THEN MAX(EditValue) ELSE NULL END ,Lid = CASE WHEN EditField = 'Lid' THEN MAX(EditValue) ELSE NULL END FROM MyAudits WHERE rn=1 GROUP BY RecordID, EditTable, EditDate, EditUser, EditField)SELECT RecordID, EditTable, EditDate, EditUser ,Brand=MAX(Brand) ,RAM=MAX(RAM) ,Colour=MAX(Colour) ,Wheels=MAX(Wheels) ,Arms=MAX(Arms) ,Capacity=MAX(Capacity) ,Lid=MAX(Lid)FROM MyGroupsGROUP BY RecordID, EditTable, EditDate, EditUserDROP TABLE #m_Audit_Example
DECLARE @SQL VARCHAR(MAX) ,@SQL1 VARCHAR(MAX) = '' ,@SQL2 VARCHAR(MAX) = '';WITH EditFields AS ( SELECT DISTINCT EditField FROM #m_Audit_Example)SELECT @SQL1 = @SQL1 + ',' + EditField + ' = CASE WHEN EditField = ''' + EditField + ''' THEN MAX(EditValue) ELSE NULL END' ,@SQL2 = @SQL2 + ',' + EditField + '=MAX(' + EditField + ')'FROM EditFieldsSELECT @SQL = ';WITH MyAudits AS ( SELECT RecordID, EditTable, EditDate, EditUser, EditField, EditValue ,rn=ROW_NUMBER() OVER (PARTITION BY EditUser, EditTable, rn ORDER BY EditDate DESC) FROM ( SELECT RecordID, EditTable, EditDate, EditUser, EditField, EditValue ,rn=ROW_NUMBER() OVER (PARTITION BY EditUser, EditTable, EditDate ORDER BY RecordID DESC) FROM #m_Audit_Example) a ), MyGroups AS ( SELECT RecordID, EditTable, EditDate, EditUser ' + @SQL1 + --,Brand = CASE WHEN EditField = 'Brand' THEN MAX(EditValue) ELSE NULL END --,RAM = CASE WHEN EditField = 'RAM' THEN MAX(EditValue) ELSE NULL END --,Colour = CASE WHEN EditField = 'Colour' THEN MAX(EditValue) ELSE NULL END --,Wheels = CASE WHEN EditField = 'Wheels' THEN MAX(EditValue) ELSE NULL END --,Arms = CASE WHEN EditField = 'Arms' THEN MAX(EditValue) ELSE NULL END --,Capacity=CASE WHEN EditField = 'Capacity' THEN MAX(EditValue) ELSE NULL END --,Lid = CASE WHEN EditField = 'Lid' THEN MAX(EditValue) ELSE NULL END ' FROM MyAudits WHERE rn=1 GROUP BY RecordID, EditTable, EditDate, EditUser, EditField)SELECT RecordID, EditTable, EditDate, EditUser ' + @SQL2 + --,Brand=MAX(Brand) --,RAM=MAX(RAM) --,Colour=MAX(Colour) --,Wheels=MAX(Wheels) --,Arms=MAX(Arms) --,Capacity=MAX(Capacity) --,Lid=MAX(Lid)' FROM MyGroupsGROUP BY RecordID, EditTable, EditDate, EditUser'EXEC (@SQL)