SELECT h.EmployeeID ,SUM(CASE WHEN h.HeaderDate BETWEEN @ReportStartingDate AND @ReportEndingDate THEN d.Amount ELSE 0 END) AS AmountPeriod ,SUM(CASE WHEN h.HeaderDate <= @ReportEndingDate THEN d.Amount ELSE 0 END) AS AmountYtd FROM Details d INNER JOIN Header h ON d.HeaderID = h.HeaderID INNER JOIN CodeIDTable1 c ON c.CodeID = d.CodeID WHERE h.HeaderDate BETWEEN @ReportStartingDate AND @ReportEndingDate GROUP BY h.EmployeeID
set nocount on;CREATE TABLE dbo.CodeIDTable1 ( CodeID INT NOT NULL,Code CHAR(1) NOT NULL);CREATE TABLE dbo.CodeIDTable2 ( CodeID INT NOT NULL,Code CHAR(1) NOT NULL);CREATE TABLE dbo.CodeIDTable3 ( CodeID INT NOT NULL,Code CHAR(1) NOT NULL);INSERT dbo.CodeIDTable1 VALUES (1, 'A');INSERT dbo.CodeIDTable1 VALUES (2, 'B');INSERT dbo.CodeIDTable1 VALUES (3, 'C');INSERT dbo.CodeIDTable2 VALUES (4, 'D');INSERT dbo.CodeIDTable2 VALUES (5, 'E');INSERT dbo.CodeIDTable2 VALUES (6, 'F');INSERT dbo.CodeIDTable3 VALUES (7, 'G');INSERT dbo.CodeIDTable3 VALUES (8, 'H');INSERT dbo.CodeIDTable3 VALUES (9, 'I');CREATE TABLE dbo.Details ( HeaderID INT NOT NULL ,DetailID INT NOT NULL ,CodeID INT NOT NULL ,EmployeeID INT NOT NULL ,Date Datetime NOT NULL ,Amount DECIMAL (18,2) NOT NULL);CREATE TABLE dbo.Header ( HeaderID INT NOT NULL ,EmployeeID INT NOT NULL ,HeaderDate DATETIME NOT NULL);INSERT dbo.Header VALUES (1, 1, '2013-01-01');INSERT dbo.Header VALUES (2, 1, '2013-01-01');INSERT dbo.Header VALUES (3, 1, '2013-01-01');INSERT dbo.Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (1, 1, 1, 1, '2013-01-01', 1.00);INSERT dbo.Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (1, 2, 1, 1, '2013-01-01', 1.00);INSERT dbo.Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (1, 3, 1, 1, '2013-01-01', 1.00);INSERT dbo.Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (2, 4, 5, 1, '2013-01-01', 1.00);INSERT dbo.Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (2, 5, 5, 1, '2013-01-01', 1.00);INSERT dbo.Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (2, 6, 5, 1, '2013-01-01', 1.00);INSERT dbo.Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (2, 7, 6, 1, '2013-01-01', 1.00);INSERT dbo.Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (3, 8, 7, 1, '2013-01-01', 1.00);INSERT dbo.Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (3, 9, 7, 1, '2013-01-01', 1.00);INSERT dbo.Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (3, 10, 7, 1, '2013-01-01', 1.00);INSERT dbo.Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (3, 11, 7, 1, '2013-01-01', 1.00);INSERT dbo.Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (3, 12, 7, 1, '2013-01-01', 1.00);--drop TABLE EmployeeSummary CREATE TABLE dbo.EmployeeSummary ( EmployeeID INT NOT NULL ,Code1PeriodToDate DECIMAL(18,2) NULL ,Code1YearToDate DECIMAL(18,2) NULL ,Code2PeriodToDate DECIMAL(18,2) NULL ,Code2YearToDate DECIMAL(18,2) NULL ,Code3PeriodToDate DECIMAL(18,2) NULL ,Code3YearToDate DECIMAL(18,2) NULL);DECLARE @FirstDayOfYear DATETIME = '2013-01-01', @LastDayOfYear DATETIME = '2013-12-31';DECLARE @ReportStartingDate DATETIME = '2013-01-01', @ReportEndingDate DATETIME = '2013-12-31';with Codes as (select 1 as CodeTableID, CodeID, Codefrom dbo.CodeIDTable1union allselect 2 as CodeTableID, CodeID, Codefrom dbo.CodeIDTable2union allselect 3 as CodeTableID, CodeID, Codefrom dbo.CodeIDTable3)insert into dbo.EmployeeSummaryselect h.EmployeeID, sum(case when c.CodeTableID = 1 and h.HeaderDate BETWEEN @ReportStartingDate AND @ReportEndingDate THEN d.Amount else 0 end) AS Code1AmountPeriod, sum(case when c.CodeTableID = 1 and h.HeaderDate <= @ReportEndingDate THEN d.Amount else 0 end) AS Code1AmountYTD, sum(case when c.CodeTableID = 2 and h.HeaderDate BETWEEN @ReportStartingDate AND @ReportEndingDate THEN d.Amount else 0 end) AS Code2AmountPeriod, sum(case when c.CodeTableID = 2 and h.HeaderDate <= @ReportEndingDate THEN d.Amount else 0 end) AS Code2AmountYTD, sum(case when c.CodeTableID = 3 and h.HeaderDate BETWEEN @ReportStartingDate AND @ReportEndingDate THEN d.Amount else 0 end) AS Code3AmountPeriod, sum(case when c.CodeTableID = 3 and h.HeaderDate <= @ReportEndingDate THEN d.Amount else 0 end) AS Code3AmountYTDfrom dbo.Header h inner join dbo.Details d on (h.HeaderID = d.HeaderID) inner join Codes c on (c.CodeID = d.CodeID)group by h.EmployeeIDwhere h.HeaderDate BETWEEN @ReportStartingDate AND @ReportEndingDate;select * from dbo.EmployeeSummary;TRUNCATE TABLE dbo.EmployeeSummary;INSERT EmployeeSummary (EmployeeID) VALUES (1);with Codes as (select 1 as CodeTableID, CodeID, Codefrom dbo.CodeIDTable1union allselect 2 as CodeTableID, CodeID, Codefrom dbo.CodeIDTable2union allselect 3 as CodeTableID, CodeID, Codefrom dbo.CodeIDTable3),SummaryData as (select h.EmployeeID, sum(case when c.CodeTableID = 1 and h.HeaderDate BETWEEN @ReportStartingDate AND @ReportEndingDate THEN d.Amount else 0 end) AS Code1AmountPeriod, sum(case when c.CodeTableID = 1 and h.HeaderDate <= @ReportEndingDate THEN d.Amount else 0 end) AS Code1AmountYTD, sum(case when c.CodeTableID = 2 and h.HeaderDate BETWEEN @ReportStartingDate AND @ReportEndingDate THEN d.Amount else 0 end) AS Code2AmountPeriod, sum(case when c.CodeTableID = 2 and h.HeaderDate <= @ReportEndingDate THEN d.Amount else 0 end) AS Code2AmountYTD, sum(case when c.CodeTableID = 3 and h.HeaderDate BETWEEN @ReportStartingDate AND @ReportEndingDate THEN d.Amount else 0 end) AS Code3AmountPeriod, sum(case when c.CodeTableID = 3 and h.HeaderDate <= @ReportEndingDate THEN d.Amount else 0 end) AS Code3AmountYTDfrom dbo.Header h inner join dbo.Details d on (h.HeaderID = d.HeaderID) inner join Codes c on (c.CodeID = d.CodeID)group by h.EmployeeIDwhere h.HeaderDate BETWEEN @ReportStartingDate AND @ReportEndingDate)update es set Code1PeriodToDate = sd.Code1AmountPeriod, Code1YearToDate = sd.Code1AmountYTD, Code2PeriodToDate = sd.Code2AmountPeriod, Code2YearToDate = sd.Code2AmountYTD, Code3PeriodToDate = sd.Code3AmountPeriod, Code3YearToDate = sd.Code3AmountYTDfrom dbo.EmployeeSummary es inner join SummaryData sd on es.EmployeeID = sd.EmployeeID;select * from dbo.EmployeeSummary;godrop table dbo.Header;drop table dbo.Details;drop table dbo.CodeIDTable1;drop table dbo.CodeIDTable2;drop table dbo.CodeIDTable3;drop table dbo.EmployeeSummary;go