CREATE TABLE CodeIDTable1 ( CodeID INT NOT NULL,Code CHAR(1) NOT NULL)CREATE TABLE CodeIDTable2 ( CodeID INT NOT NULL,Code CHAR(1) NOT NULL)CREATE TABLE CodeIDTable3 ( CodeID INT NOT NULL,Code CHAR(1) NOT NULL)INSERT CodeIDTable1 VALUES (1, 'A') INSERT CodeIDTable1 VALUES (2, 'B') INSERT CodeIDTable1 VALUES (3, 'C') INSERT CodeIDTable2 VALUES (4, 'D') INSERT CodeIDTable2 VALUES (5, 'E') INSERT CodeIDTable2 VALUES (6, 'F') INSERT CodeIDTable3 VALUES (7, 'G') INSERT CodeIDTable3 VALUES (8, 'H') INSERT CodeIDTable3 VALUES (9, 'I') CREATE TABLE 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 Header ( HeaderID INT NOT NULL ,EmployeeID INT NOT NULL ,HeaderDate DATETIME NOT NULL)INSERT Header VALUES (1, 1, '2013-01-01')INSERT Header VALUES (2, 1, '2013-01-01')INSERT Header VALUES (3, 1, '2013-01-01')INSERT Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (1, 1, 1, 1, '2013-01-01', 1.00)INSERT Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (1, 2, 1, 1, '2013-01-01', 1.00)INSERT Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (1, 3, 1, 1, '2013-01-01', 1.00)INSERT Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (2, 4, 5, 1, '2013-01-01', 1.00)INSERT Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (2, 5, 5, 1, '2013-01-01', 1.00)INSERT Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (2, 6, 5, 1, '2013-01-01', 1.00)INSERT Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (2, 7, 6, 1, '2013-01-01', 1.00)INSERT Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (3, 8, 7, 1, '2013-01-01', 1.00)INSERT Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (3, 9, 7, 1, '2013-01-01', 1.00)INSERT Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (3, 10, 7, 1, '2013-01-01', 1.00)INSERT Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (3, 11, 7, 1, '2013-01-01', 1.00)INSERT Details (HeaderID, DetailID, CodeID, EmployeeID, Date, Amount) VALUES (3, 12, 7, 1, '2013-01-01', 1.00)--drop TABLE EmployeeSummary CREATE TABLE 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)--TRUNCATE TABLE EmployeeSummaryINSERT EmployeeSummary (EmployeeID) VALUES (1)DECLARE @FirstDayOfYear DATETIME = '2013-01-01', @LastDayOfYear DATETIME = '2013-12-31'DECLARE @ReportStartingDate DATETIME = '2013-01-01', @ReportEndingDate DATETIME = '2013-12-31'UPDATE EmployeeSummarySET Code1PeriodToDate = Summary.AmountPeriod ,Code1YearToDate = Summary.AmountYtdFROM ( SELECT Header.EmployeeID ,SUM(CASE WHEN Header.HeaderDate BETWEEN @ReportStartingDate AND @ReportEndingDate THEN Details.Amount ELSE 0 END) AS AmountPeriod ,SUM(CASE WHEN Header.HeaderDate <= @ReportEndingDate THEN Details.Amount ELSE 0 END) AS AmountYtd FROM Details INNER JOIN CodeIDTable1 ON CodeIDTable1.CodeID = Details.CodeID INNER JOIN Header ON Details.HeaderID = Header.HeaderID WHERE Header.HeaderDate BETWEEN @ReportStartingDate AND @ReportEndingDate GROUP BY Header.EmployeeID ) AS SummaryWHERE EmployeeSummary.EmployeeId = Summary.EmployeeIDUPDATE EmployeeSummarySET Code2PeriodToDate = Summary.AmountPeriod ,Code2YearToDate = Summary.AmountYtdFROM ( SELECT Header.EmployeeID ,SUM(CASE WHEN Header.HeaderDate BETWEEN @ReportStartingDate AND @ReportEndingDate THEN Details.Amount ELSE 0 END) AS AmountPeriod ,SUM(CASE WHEN Header.HeaderDate <= @ReportEndingDate THEN Details.Amount ELSE 0 END) AS AmountYtd FROM Details INNER JOIN CodeIDTable2 ON CodeIDTable2.CodeID = Details.CodeID INNER JOIN Header ON Details.HeaderID = Header.HeaderID WHERE Header.HeaderDate BETWEEN @ReportStartingDate AND @ReportEndingDate GROUP BY Header.EmployeeID ) AS SummaryWHERE EmployeeSummary.EmployeeId = Summary.EmployeeIDUPDATE EmployeeSummarySET Code3PeriodToDate = Summary.AmountPeriod ,Code3YearToDate = Summary.AmountYtdFROM ( SELECT Header.EmployeeID ,SUM(CASE WHEN Header.HeaderDate BETWEEN @ReportStartingDate AND @ReportEndingDate THEN Details.Amount ELSE 0 END) AS AmountPeriod ,SUM(CASE WHEN Header.HeaderDate <= @ReportEndingDate THEN Details.Amount ELSE 0 END) AS AmountYtd FROM Details INNER JOIN CodeIDTable3 ON CodeIDTable3.CodeID = Details.CodeID INNER JOIN Header ON Details.HeaderID = Header.HeaderID WHERE Header.HeaderDate BETWEEN @ReportStartingDate AND @ReportEndingDate GROUP BY Header.EmployeeID ) AS SummaryWHERE EmployeeSummary.EmployeeId = Summary.EmployeeIDSELECT * FROM EmployeeSummary
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.EmployeeID;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.EmployeeID)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
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