The following sandbox can be used to test your solutions against the 'tricky' data.
/***********************************************************************
----------------------------------------------
LOGIC Testing Sandbox for TSQL Challenge 25
Copyright © beyondrelational.com
----------------------------------------------
Notes:
1. Copy this template and paste in your SSMS Query editor
2. Insert your query (solution for TSQL Challenge 25)
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.
(There may be some basic info as to what is missing/extra as well)
Revision History:
Rev 00 - 07 Apr 2010 - Seth Phelabaum - Initial Release
Rev 01 - 09 Apr 2010 - Seth Phelabaum - Fixed an potential issue with
sequencing due to multiple appointments starting at the same time
Added a bit better information if there are failures
(Still a lot that could be done here)
***********************************************************************/
/*
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
-- Drop the source tables, if exist
IF OBJECT_ID('TC25_Schedules','U') IS NOT NULL BEGIN
DROP TABLE TC25_Schedules;
END
IF OBJECT_ID('TC25_Appointments','U') IS NOT NULL BEGIN
DROP TABLE TC25_Appointments;
END
-- Create the source tables
CREATE TABLE TC25_Appointments(
AppID INT IDENTITY PRIMARY KEY,
TaskName VARCHAR(100),
BeginAt CHAR(5),
Duration CHAR(5),
StartDate SMALLDATETIME,
EndDate SMALLDATETIME
);
CREATE TABLE TC25_Schedules (
AppID INT NOT NULL FOREIGN KEY
REFERENCES TC25_Appointments(AppID),
Recurrence VARCHAR(50),
Pattern VARCHAR(50),
Val TINYINT
);
-- Populate the source tables
SET IDENTITY_INSERT TC25_Appointments ON
INSERT INTO TC25_Appointments(AppID,TaskName,BeginAt,Duration,StartDate,EndDate)
SELECT 29, 'More Beer', '10:00', '03:00' ,'02/21/2010', '02/25/2010'
UNION ALL
SELECT 24, 'AA Meeting', '10:01', '03:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 25, 'AA Meeting 2', '10:02', '03:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 26, 'AA Meeting 3', '10:03', '03:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 28, 'BEER ', '10:31', '03:00' ,'02/19/2010', '03/18/2010'
UNION ALL
SELECT 21, 'Beer Drinking Meeting', '10:32', '03:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 10, 'Computer Training', '10:04', '03:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 6, 'Customer Meeting', '10:05', '03:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 7, 'Customer Meeting 2', '10:06', '03:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 27, 'Drinking Beer Meeting', '10:07', '03:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 19, 'Floor Cleaning Training', '10:33', '03:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 9, 'Forklift Training', '10:08', '24:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 5, 'General Appt', '10:09', '03:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 3, 'HR Meeting', '10:10', '28:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 47, 'Long Lost Meeting', '10:11', '02:00' ,'02/25/2005', '02/26/2010'
UNION ALL
SELECT 22, 'Meeting about Beer', '10:12', '03:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 23, 'Meeting about Drinking Beer', '00:00', '03:00' ,'02/21/2010', '02/25/2010'
UNION ALL
SELECT 18, 'Meeting about Meetings', '10:13', '03:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 4, 'Office Meeting', '10:14', '30:00' ,'02/21/2010', '2010/02/23 09:59:00'
UNION ALL
SELECT 13, 'Office Politeness Meeting', '10:15', '03:00' ,'05/21/2009', '03/18/2010'
UNION ALL
SELECT 14, 'Political Correctness Training', '10:16', '03:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 33, 'Repeating Meeting', '08:45', '00:10' ,'02/25/2010', '03/18/2010'
UNION ALL
SELECT 34, 'Repeating Meeting', '09:00', '00:10' ,'02/20/2010', '03/18/2010'
UNION ALL
SELECT 45, 'Repeating Meeting', '12:15', '10:00' ,'02/21/2009', '03/18/2010'
UNION ALL
SELECT 46, 'Repeating Meeting', '12:30', '08:00' ,'02/21/2009', '03/18/2010'
UNION ALL
SELECT 1, 'Sales Meeting', '10:17', '03:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 8, 'Sales Meeting 2', '10:18', '23:59' ,'02/21/2010', '02/28/2010'
UNION ALL
SELECT 15, 'Sample Data Creation Training', '10:19', '03:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 12, 'Sexual Harassment Meeting', '10:20', '03:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 16, 'Tally Table Instruction', '10:21', '03:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 2, 'Training', '10:22', '26:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 20, 'TSQL Challenges Meeting', '10:00', '03:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 11, 'Typing Training', '10:23', '03:00' ,'02/21/2010', '03/18/2010'
UNION ALL
SELECT 17, 'Useless Meeting', '10:24', '03:00' ,'02/21/2010', '03/18/2010'
SET IDENTITY_INSERT TC25_Appointments OFF
INSERT INTO TC25_Schedules(AppID, Recurrence, Pattern, Val)
SELECT 29, 'Yearly', 'Fourth Thu Every Feb', NULL UNION ALL
SELECT 24, 'Weekly', 'Tue', 13 UNION ALL
SELECT 25, 'Yearly', 'Every N', 1 UNION ALL
SELECT 26, 'Yearly', 'Every N', 255 UNION ALL
SELECT 28, 'Yearly', 'Third Sat Every Feb', NULL UNION ALL
SELECT 21, 'Monthly', 'Last Wed Every N', 1 UNION ALL
SELECT 10, 'Weekly', 'Every N', 255 UNION ALL
SELECT 6, 'Daily', 'Every N', 80 UNION ALL
SELECT 7, 'Daily', 'Weekends', 10 UNION ALL
SELECT 27, 'Yearly', 'Fourth Sat Every Feb', NULL UNION ALL
SELECT 19, 'Monthly', 'Fourth Sat Every N', 1 UNION ALL
SELECT 9, 'Daily', 'Every N', 1 UNION ALL
SELECT 5, 'Daily', 'Every N', 35 UNION ALL
SELECT 3, 'Daily', 'Every N', 1 UNION ALL
SELECT 47, 'Yearly', 'Every N', 5 UNION ALL
SELECT 22, 'Daily', 'Every N', 255 UNION ALL
SELECT 23, 'Monthly', 'Fourth Thu Every N', 1 UNION ALL
SELECT 18, 'Monthly', 'Fourth Wed Every N', 1 UNION ALL
SELECT 4, 'Monthly', 'Fourth Wed Every N', 1 UNION ALL
SELECT 13, 'Weekly', 'Every N', 40 UNION ALL
SELECT 14, 'Monthly', 'Every N', 1 UNION ALL
SELECT 33, 'Daily ', 'Every N', 1 UNION ALL
SELECT 45, 'Daily ', 'Every N', 1 UNION ALL
SELECT 46, 'Daily ', 'Every N', 1 UNION ALL
SELECT 1, 'Daily', 'Weekdays', 2 UNION ALL
SELECT 8, 'Daily', 'Weekends', NULL UNION ALL
SELECT 15, 'Monthly', 'Every N', 1 UNION ALL
SELECT 12, 'Weekly', 'Wed', 13 UNION ALL
SELECT 16, 'Monthly', 'First Sun Every N', 1 UNION ALL
SELECT 2, 'Daily', 'Weekdays', NULL UNION ALL
SELECT 20, 'Monthly', 'Last Sun Every N', 1 UNION ALL
SELECT 11, 'Weekly', 'Tue', NULL UNION ALL
SELECT 17, 'Monthly', 'Second Tue Every N', 1
;
/* Insert your query below */
/* Insert your query above */
END
GO
SET NOCOUNT ON
/*
Start the testing phase
*/
DECLARE @x TABLE(
AutoID INT IDENTITY,
TaskName VARCHAR(100),
Date VARCHAR(10),
Start CHAR(5),
Duration CHAR(5)
)
-- Execute the code and
INSERT @x EXEC #TestSolution
-- Table to hold the expected results
DECLARE @z TABLE(
AutoID INT,
TaskName VARCHAR(100),
Date VARCHAR(10),
Start CHAR(5),
Duration CHAR(5)
)
-- Build the expected results
INSERT INTO @z(AutoID, TaskName, Date, Start, Duration)
SELECT 1, N'BEER ', '2010-02-20', N'10:31', N'03:00'
UNION ALL
SELECT 2, N'Repeating Meeting', '2010-02-20', N'12:15', N'10:00'
UNION ALL
SELECT 3, N'Repeating Meeting', '2010-02-20', N'12:30', N'08:00'
UNION ALL
SELECT 4, N'AA Meeting 2', '2010-02-21', N'10:02', N'03:00'
UNION ALL
SELECT 5, N'AA Meeting 3', '2010-02-21', N'10:03', N'03:00'
UNION ALL
SELECT 6, N'Computer Training', '2010-02-21', N'10:04', N'03:00'
UNION ALL
SELECT 7, N'Customer Meeting', '2010-02-21', N'10:05', N'03:00'
UNION ALL
SELECT 8, N'Customer Meeting 2', '2010-02-21', N'10:06', N'03:00'
UNION ALL
SELECT 9, N'Forklift Training', '2010-02-21', N'10:08', N'24:00'
UNION ALL
SELECT 10, N'General Appt', '2010-02-21', N'10:09', N'03:00'
UNION ALL
SELECT 11, N'HR Meeting', '2010-02-21', N'10:10', N'28:00'
UNION ALL
SELECT 12, N'Meeting about Beer', '2010-02-21', N'10:12', N'03:00'
UNION ALL
SELECT 13, N'Political Correctness Training', '2010-02-21', N'10:16', N'03:00'
UNION ALL
SELECT 14, N'Sales Meeting 2', '2010-02-21', N'10:18', N'23:59'
UNION ALL
SELECT 15, N'Sample Data Creation Training', '2010-02-21', N'10:19', N'03:00'
UNION ALL
SELECT 16, N'Repeating Meeting', '2010-02-21', N'12:15', N'10:00'
UNION ALL
SELECT 17, N'Repeating Meeting', '2010-02-21', N'12:30', N'08:00'
UNION ALL
SELECT 18, N'Forklift Training', '2010-02-22', N'10:08', N'24:00'
UNION ALL
SELECT 19, N'HR Meeting', '2010-02-22', N'10:10', N'28:00'
UNION ALL
SELECT 20, N'Sales Meeting', '2010-02-22', N'10:17', N'03:00'
UNION ALL
SELECT 21, N'Training', '2010-02-22', N'10:22', N'26:00'
UNION ALL
SELECT 22, N'Repeating Meeting', '2010-02-22', N'12:15', N'10:00'
UNION ALL
SELECT 23, N'Repeating Meeting', '2010-02-22', N'12:30', N'08:00'
UNION ALL
SELECT 24, N'AA Meeting', '2010-02-23', N'10:01', N'03:00'
UNION ALL
SELECT 25, N'Forklift Training', '2010-02-23', N'10:08', N'24:00'
UNION ALL
SELECT 26, N'HR Meeting', '2010-02-23', N'10:10', N'28:00'
UNION ALL
SELECT 27, N'Sales Meeting', '2010-02-23', N'10:17', N'03:00'
UNION ALL
SELECT 28, N'Training', '2010-02-23', N'10:22', N'26:00'
UNION ALL
SELECT 29, N'Typing Training', '2010-02-23', N'10:23', N'03:00'
UNION ALL
SELECT 30, N'Repeating Meeting', '2010-02-23', N'12:15', N'10:00'
UNION ALL
SELECT 31, N'Repeating Meeting', '2010-02-23', N'12:30', N'08:00'
UNION ALL
SELECT 32, N'Forklift Training', '2010-02-24', N'10:08', N'24:00'
UNION ALL
SELECT 33, N'HR Meeting', '2010-02-24', N'10:10', N'28:00'
UNION ALL
SELECT 34, N'Meeting about Meetings', '2010-02-24', N'10:13', N'03:00'
UNION ALL
SELECT 35, N'Sales Meeting', '2010-02-24', N'10:17', N'03:00'
UNION ALL
SELECT 36, N'Sexual Harassment Meeting', '2010-02-24', N'10:20', N'03:00'
UNION ALL
SELECT 37, N'Training', '2010-02-24', N'10:22', N'26:00'
UNION ALL
SELECT 38, N'Beer Drinking Meeting', '2010-02-24', N'10:32', N'03:00'
UNION ALL
SELECT 39, N'Repeating Meeting', '2010-02-24', N'12:15', N'10:00'
UNION ALL
SELECT 40, N'Repeating Meeting', '2010-02-24', N'12:30', N'08:00'
UNION ALL
SELECT 41, N'Meeting about Drinking Beer', '2010-02-25', N'00:00', N'03:00'
UNION ALL
SELECT 42, N'Repeating Meeting', '2010-02-25', N'08:45 ', N'00:10'
UNION ALL
SELECT 43, N'Forklift Training', '2010-02-25', N'10:08', N'24:00'
UNION ALL
SELECT 44, N'HR Meeting', '2010-02-25', N'10:10', N'28:00'
UNION ALL
SELECT 45, N'Long Lost Meeting', '2010-02-25', N'10:11', N'02:00'
UNION ALL
SELECT 46, N'Office Politeness Meeting', '2010-02-25', N'10:15', N'03:00'
UNION ALL
SELECT 47, N'Sales Meeting', '2010-02-25', N'10:17', N'03:00'
UNION ALL
SELECT 48, N'Training', '2010-02-25', N'10:22', N'26:00'
UNION ALL
SELECT 49, N'Repeating Meeting', '2010-02-25', N'12:15', N'10:00'
UNION ALL
SELECT 50, N'Repeating Meeting', '2010-02-25', N'12:30', N'08:00'
UNION ALL
SELECT 51, N'Repeating Meeting', '2010-02-26', N'08:45 ', N'00:10'
UNION ALL
SELECT 52, N'Forklift Training', '2010-02-26', N'10:08', N'24:00'
UNION ALL
SELECT 53, N'HR Meeting', '2010-02-26', N'10:10', N'28:00'
UNION ALL
SELECT 54, N'Sales Meeting', '2010-02-26', N'10:17', N'03:00'
UNION ALL
SELECT 55, N'Training', '2010-02-26', N'10:22', N'26:00'
UNION ALL
SELECT 56, N'Repeating Meeting', '2010-02-26', N'12:15', N'10:00'
UNION ALL
SELECT 57, N'Repeating Meeting', '2010-02-26', N'12:30', N'08:00'
UNION ALL
SELECT 58, N'Repeating Meeting', '2010-02-27', N'08:45 ', N'00:10'
UNION ALL
SELECT 59, N'Customer Meeting 2', '2010-02-27', N'10:06', N'03:00'
UNION ALL
SELECT 60, N'Drinking Beer Meeting', '2010-02-27', N'10:07', N'03:00'
UNION ALL
SELECT 61, N'Forklift Training', '2010-02-27', N'10:08', N'24:00'
UNION ALL
SELECT 62, N'HR Meeting', '2010-02-27', N'10:10', N'28:00'
UNION ALL
SELECT 63, N'Sales Meeting 2', '2010-02-27', N'10:18', N'23:59'
UNION ALL
SELECT 64, N'Floor Cleaning Training', '2010-02-27', N'10:33', N'03:00'
UNION ALL
SELECT 65, N'Repeating Meeting', '2010-02-27', N'12:15', N'10:00'
UNION ALL
SELECT 66, N'Repeating Meeting', '2010-02-27', N'12:30', N'08:00'
UNION ALL
SELECT 67, N'Repeating Meeting', '2010-02-28', N'08:45 ', N'00:10'
UNION ALL
SELECT 68, N'TSQL Challenges Meeting', '2010-02-28', N'10:00', N'03:00'
UNION ALL
SELECT 69, N'Customer Meeting 2', '2010-02-28', N'10:06', N'03:00'
UNION ALL
SELECT 70, N'Forklift Training', '2010-02-28', N'10:08', N'24:00'
UNION ALL
SELECT 71, N'HR Meeting', '2010-02-28', N'10:10', N'28:00'
UNION ALL
SELECT 72, N'Repeating Meeting', '2010-02-28', N'12:15', N'10:00'
UNION ALL
SELECT 73, N'Repeating Meeting', '2010-02-28', N'12:30', N'08:00'
SELECT * FROM @z order by date, start
-- 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!'
IF EXISTS ( -- Show Missing/Extra Rows
SELECT TaskName, [Date], Start, Duration FROM @x
EXCEPT
SELECT TaskName, [Date], Start, Duration FROM @z
UNION ALL
SELECT TaskName, [Date], Start, Duration FROM @z
EXCEPT
SELECT TaskName, [Date], Start, Duration FROM @x
)
BEGIN
SELECT TaskName, [Date], Start, Duration,'Extra' FROM @x
EXCEPT
SELECT TaskName, [Date], Start, Duration,'Extra' FROM @z
UNION ALL
SELECT TaskName, [Date], Start, Duration,'Missing' FROM @z
EXCEPT
SELECT TaskName, [Date], Start, Duration, 'Missing' FROM @x
END ELSE BEGIN -- If No Missing/Extra rows, show Sequencing Errors.
SELECT
*, 'Sequence'
FROM (
SELECT * FROM @x EXCEPT SELECT * FROM @z
UNION ALL
SELECT * FROM @z EXCEPT SELECT * FROM @x
) A
END
END ELSE BEGIN
PRINT 'Congratulations...Passed!'
END