Your database is not normalised. SQL is very suitable to process normalised databases. Processing a denormalised database is far far harder.
Step one: normalise the table:
DROP TABLE IF EXISTS dbo.DaTable;
CREATE TABLE dbo.DaTable(
CUSTSYSREF int NOT NULL PRIMARY KEY,
REPSSYSREF int NOT NULL,
MON bit NOT NULL DEFAULT 0,
TUE bit NOT NULL DEFAULT 0,
WED bit NOT NULL DEFAULT 0,
THU bit NOT NULL DEFAULT 0,
FRI bit NOT NULL DEFAULT 0,
SAT bit NOT NULL DEFAULT 0,
SUN bit NOT NULL DEFAULT 0
)
INSERT INTO dbo.DaTable(CUSTSYSREF, REPSSYSREF, MON, TUE, WED, THU, FRI, SAT, SUN) VALUES
(231, 15, 0, 0, 1, 0, 0, 0, 0),
(232, 15, 0, 1, 0, 0, 0, 0, 0),
(233, 16, 1, 0, 1, 0, 0, 0, 0),
(234, 17, 0, 0, 1, 0, 0, 1, 0)
SELECT * FROM dbo.DaTable
DROP TABLE IF EXISTS dbo.ParentTable;
DROP TABLE IF EXISTS dbo.ChildTable;
DROP TABLE IF EXISTS dbo.DaDaysTable;
CREATE TABLE dbo.DaDaysTable(
Day_Of_Week_id int NOT NULL PRIMARY KEY,
Day_Of_Week CHAR(3)
)
INSERT INTO dbo.DaDaysTable(Day_Of_Week_id, Day_Of_Week) VALUES
(1, 'MON'), (2, 'TUE'), (3, 'WED'), (4, 'THU'), (5, 'FRI'), (6, 'SAT'), (7, 'SUN');
CREATE TABLE dbo.ParentTable(
parent_id int IDENTITY(1, 1) NOT NULL PRIMARY KEY,
CUSTSYSREF int NOT NULL,
REPSSYSREF int NOT NULL,
)
INSERT INTO dbo.ParentTable(CUSTSYSREF, REPSSYSREF)
SELECT DISTINCT CUSTSYSREF, REPSSYSREF
FROM dbo.DaTable
GO
SELECT * from dbo.ParentTable
CREATE TABLE dbo.ChildTable(
id int IDENTITY(1, 1) NOT NULL PRIMARY KEY,
parent_id int NOT NULL,
Day_Of_Week_id int NOT NULL
)
INSERT INTO dbo.ChildTable(parent_id, Day_Of_Week_id)
SELECT PT.parent_id
, DOW.day_of_week_id
FROM dbo.DaTable as DT
INNER JOIN dbo.ParentTable as PT
ON DT.CUSTSYSREF = PT.CUSTSYSREF
AND DT.REPSSYSREF = PT.REPSSYSREF
INNER JOIN dbo.DaDaysTable as DOW
ON DOW.Day_Of_Week = 'MON'
AND DT.MON = 1
INSERT INTO dbo.ChildTable(parent_id, Day_Of_Week_id)
SELECT PT.parent_id
, DOW.day_of_week_id
FROM dbo.DaTable as DT
INNER JOIN dbo.ParentTable as PT
ON DT.CUSTSYSREF = PT.CUSTSYSREF
AND DT.REPSSYSREF = PT.REPSSYSREF
INNER JOIN dbo.DaDaysTable as DOW
ON DOW.Day_Of_Week = 'TUE'
AND DT.TUE = 1
INSERT INTO dbo.ChildTable(parent_id, Day_Of_Week_id)
SELECT PT.parent_id
, DOW.day_of_week_id
FROM dbo.DaTable as DT
INNER JOIN dbo.ParentTable as PT
ON DT.CUSTSYSREF = PT.CUSTSYSREF
AND DT.REPSSYSREF = PT.REPSSYSREF
INNER JOIN dbo.DaDaysTable as DOW
ON DOW.Day_Of_Week = 'WED'
AND DT.WED = 1
INSERT INTO dbo.ChildTable(parent_id, Day_Of_Week_id)
SELECT PT.parent_id
, DOW.day_of_week_id
FROM dbo.DaTable as DT
INNER JOIN dbo.ParentTable as PT
ON DT.CUSTSYSREF = PT.CUSTSYSREF
AND DT.REPSSYSREF = PT.REPSSYSREF
INNER JOIN dbo.DaDaysTable as DOW
ON DOW.Day_Of_Week = 'THU'
AND DT.THU = 1
INSERT INTO dbo.ChildTable(parent_id, Day_Of_Week_id)
SELECT PT.parent_id
, DOW.day_of_week_id
FROM dbo.DaTable as DT
INNER JOIN dbo.ParentTable as PT
ON DT.CUSTSYSREF = PT.CUSTSYSREF
AND DT.REPSSYSREF = PT.REPSSYSREF
INNER JOIN dbo.DaDaysTable as DOW
ON DOW.Day_Of_Week = 'FRI'
AND DT.FRI = 1
INSERT INTO dbo.ChildTable(parent_id, Day_Of_Week_id)
SELECT PT.parent_id
, DOW.day_of_week_id
FROM dbo.DaTable as DT
INNER JOIN dbo.ParentTable as PT
ON DT.CUSTSYSREF = PT.CUSTSYSREF
AND DT.REPSSYSREF = PT.REPSSYSREF
INNER JOIN dbo.DaDaysTable as DOW
ON DOW.Day_Of_Week = 'SAT'
AND DT.SAT = 1
INSERT INTO dbo.ChildTable(parent_id, Day_Of_Week_id)
SELECT PT.parent_id
, DOW.day_of_week_id
FROM dbo.DaTable as DT
INNER JOIN dbo.ParentTable as PT
ON DT.CUSTSYSREF = PT.CUSTSYSREF
AND DT.REPSSYSREF = PT.REPSSYSREF
INNER JOIN dbo.DaDaysTable as DOW
ON DOW.Day_Of_Week = 'SUN'
AND DT.SUN = 1
Step two: get the result you want, based on a normalised table:
;WITH CTE AS(
SELECT CT.parent_id
, DOW.day_of_week
, ROW_NUMBER() OVER (PARTITION BY CT.parent_id ORDER BY DOW.Day_Of_Week_id ASC) as RowNum
FROM dbo.ChildTable as CT
INNER JOIN dbo.DaDaysTable as DOW
ON CT.Day_Of_Week_id = DOW.Day_Of_Week_id
)
SELECT PT.CUSTSYSREF
, PT.REPSSYSREF
, COALESCE(FirstDay.Day_Of_Week, '') as DayOfCall1
, COALESCE(SecondDay.Day_Of_Week, '') as DayOfCall2
FROM dbo.ParentTable as PT
LEFT OUTER JOIN CTE as FirstDay
ON PT.parent_id = FirstDay.parent_id
AND FirstDay.RowNum = 1
LEFT OUTER JOIN CTE as SecondDay
ON PT.parent_id = SecondDay.parent_id
AND SecondDay.RowNum = 2