TSQL Challenge 31 - Basic Testing Sandbox



You can use the TSQL template given below to test your solutions against the basic data of TSQL Challenge 31

/***********************************************************************
 ---------------------------------------------- 
 BASIC Testing Sandbox for TSQL Challenge 31
 Copyright © beyondrelational.com
 ---------------------------------------------- 

 Notes:
 1. Copy this template and paste in your SSMS Query editor

 2. Insert your query (solution for TSQL Challenge 31) 
    in the Section between "Insert your query below" 
    and "Insert your query above"

 3. Run the whole batch. IF you see 
    "Invalid Results...Failed!" getting prINTed in output 
    window, there is something wrong in the query. 

 Revision History:
 Rev 00 - 21 March 2010 - Jacob Sebastian	- Initial Release
***********************************************************************/
/*
	Create a wrapper procedure around the solution
*/
IF OBJECT_ID('tempdb..#TestSolution') IS NOT NULL BEGIN
	DROP PROCEDURE #TestSolution
END
GO

CREATE PROCEDURE #TestSolution AS
BEGIN
	IF OBJECT_ID('TC31_Employee','U') is not null 
		DROP TABLE TC31_Employee
	;

	CREATE TABLE TC31_Employee(
	  empid INT,
	  empname VARCHAR(25))
	;

	IF OBJECT_ID('TC31_ResourceType','U') is not null 
		DROP TABLE TC31_ResourceType
	;

	CREATE TABLE TC31_ResourceType(
	  restypeid INT,
	  restypename VARCHAR(25))
	;

	IF OBJECT_ID('TC31_Department','U') is not null 
		DROP TABLE TC31_Department
	;

	CREATE TABLE TC31_Department(
	  deptid INT,
	  deptname VARCHAR(25))
	;

	IF OBJECT_ID('TC31_ResourceTypeAssoc','U') is not null 
		DROP TABLE TC31_ResourceTypeAssoc
	;

	CREATE TABLE TC31_ResourceTypeAssoc(
	  empid INT,
	  restypeid INT,
	  resfrom DATETIME,
	  resuntil DATETIME)
	;

	IF OBJECT_ID('TC31_DepartmentAssoc','U') is not null 
		DROP TABLE TC31_DepartmentAssoc
	;

	CREATE TABLE TC31_DepartmentAssoc(
	  empid INT,
	  deptid INT,
	  deptfrom DATETIME,
	  deptuntil DATETIME)
	;

	IF OBJECT_ID('TC31_Holiday','U') is not null 
		DROP TABLE TC31_Holiday
	;

	CREATE TABLE TC31_Holiday(
	  holdate DATETIME)
	;

	IF OBJECT_ID('TC31_Vacation','U') is not null 
		DROP TABLE TC31_Vacation
	;

	CREATE TABLE TC31_Vacation(
	  empid INT,
	  vacfrom DATETIME,
	  vacuntil DATETIME)
	;

	IF OBJECT_ID('TC31_EstimatedHours','U') is not null 
		DROP TABLE TC31_EstimatedHours
	;

	CREATE TABLE TC31_EstimatedHours(
	  empid INT,
	  workmonth DATETIME,
	  workhours DECIMAL(8,2))
	;

	INSERT INTO TC31_Employee VALUES(1,'John')
	INSERT INTO TC31_Employee VALUES(2,'Frank')
	;

	INSERT INTO TC31_Resourcetype VALUES(1,'Project Manager')
	INSERT INTO TC31_Resourcetype VALUES(2,'Sales Assistant')
	INSERT INTO TC31_Resourcetype VALUES(3,'Client Service Manager')
	INSERT INTO TC31_Resourcetype VALUES(4,'Functional Analyst')
	INSERT INTO TC31_Resourcetype VALUES(5,'Application Expert')
	INSERT INTO TC31_Resourcetype VALUES(6,'DBA')
	;

	INSERT INTO TC31_Department VALUES(1,'Department A')
	INSERT INTO TC31_Department VALUES(2,'Department B')
	INSERT INTO TC31_Department VALUES(3,'Department C')
	;

	INSERT INTO TC31_ResourceTypeAssoc VALUES(1,2,'2010-01-01','2010-03-15')
	INSERT INTO TC31_ResourceTypeAssoc VALUES(1,1,'2010-03-16','2010-04-15')
	INSERT INTO TC31_ResourceTypeAssoc VALUES(1,3,'2010-04-16',null)
	INSERT INTO TC31_ResourceTypeAssoc VALUES(2,4,'2010-01-01','2010-01-15')
	INSERT INTO TC31_ResourceTypeAssoc VALUES(2,5,'2010-01-16','2010-01-20')
	INSERT INTO TC31_ResourceTypeAssoc VALUES(2,6,'2010-01-21',null)
	;

	INSERT INTO TC31_DepartmentAssoc VALUES(1,1,'2010-01-01','2010-02-28')
	INSERT INTO TC31_DepartmentAssoc VALUES(1,3,'2010-03-01',null)
	INSERT INTO TC31_DepartmentAssoc VALUES(2,2,'2010-01-01','2010-02-28')
	INSERT INTO TC31_DepartmentAssoc VALUES(2,3,'2010-03-01',null)
	;

	INSERT INTO TC31_Holiday VALUES('2010-01-01')
	INSERT INTO TC31_Holiday VALUES('2010-01-06')
	INSERT INTO TC31_Holiday VALUES('2010-04-01')
	INSERT INTO TC31_Holiday VALUES('2010-04-05')
	;

	INSERT INTO TC31_Vacation VALUES(1,'2010-01-25','2010-02-05')
	INSERT INTO TC31_Vacation VALUES(2,'2010-01-20','2010-02-01') 
         ;

	INSERT INTO TC31_EstimatedHours VALUES(1,'2010-01-01',190.5)
	INSERT INTO TC31_EstimatedHours VALUES(1,'2010-02-01',175.25)
	INSERT INTO TC31_EstimatedHours VALUES(1,'2010-03-01',150)
	INSERT INTO TC31_EstimatedHours VALUES(1,'2010-04-01',180)
	INSERT INTO TC31_EstimatedHours VALUES(2,'2010-01-01',200)
	INSERT INTO TC31_EstimatedHours VALUES(2,'2010-02-01',190)
	INSERT INTO TC31_EstimatedHours VALUES(2,'2010-03-01',180)
	INSERT INTO TC31_EstimatedHours VALUES(2,'2010-04-01',170)
	; 

	/* Insert your query below */

	/* Insert your query above */
END
GO

SET NOCOUNT ON
/*
	Start the testing phase
*/

DECLARE @x TABLE(
	AutoID INT IDENTITY,
	Department VARCHAR(50),
	ResourceType VARCHAR(50),
	Month VARCHAR(50),
	Hours DECIMAL(8,2)
)

-- Execute the code and 
INSERT @x EXEC #TestSolution

DECLARE @z TABLE (
	AutoID INT IDENTITY,
	Department VARCHAR(50),
	ResourceType VARCHAR(50),
	Month VARCHAR(50),
	Hours DECIMAL(8,2)
)

INSERT INTO @z(Department, ResourceType, Month, Hours)
SELECT 'Department A','Sales Assistant','2010-01',190.50
UNION ALL
SELECT 'Department A','Sales Assistant','2010-02',175.25
UNION ALL
SELECT 'Department B','Application Expert','2010-01',31.58
UNION ALL
SELECT 'Department B','DBA','2010-01',73.68
UNION ALL
SELECT 'Department B','DBA','2010-02',190.00
UNION ALL
SELECT 'Department B','Functional Analyst','2010-01',94.74
UNION ALL
SELECT 'Department C','Client Service Manager','2010-04',99.00
UNION ALL
SELECT 'Department C','DBA','2010-03',180.00
UNION ALL
SELECT 'Department C','DBA','2010-04',170.00
UNION ALL
SELECT 'Department C','Project Manager','2010-03',78.26
UNION ALL
SELECT 'Department C','Project Manager','2010-04',81.00
UNION ALL
SELECT 'Department C','Sales Assistant','2010-03',71.74

-- Match the output with expected result.
IF EXISTS(
  (SELECT * FROM @x EXCEPT SELECT * FROM @z)
  UNION ALL
  (SELECT * FROM @z EXCEPT SELECT * FROM @x))
BEGIN
  PRINT 'Invalid Results...Failed!'
END ELSE BEGIN
  PRINT 'Congratulations...Passed!'
END