Here's a different approach:
WITH data (
RecordID, Date1 , Date2 , Date3 , Date4
) AS (
SELECT 1, '2011-05-10','2011-08-16', NULL ,'2011-11-22' UNION ALL
SELECT 2, NULL ,'2012-02-03','2012-02-27','2012-03-05' UNION ALL
SELECT 3, '2011-05-30','2011-05-11','2011-08-17','2011-09-15' UNION ALL
SELECT 4, '2011-05-30', NULL , NULL , NULL
)
SELECT
*,
CheckDates = (
SELECT
MAX(CASE IdRank WHEN DateRank THEN 'correct' ELSE 'incorrect' END)
FROM (
SELECT
IdRank = ROW_NUMBER() OVER (ORDER BY ID),
DateRank = ROW_NUMBER() OVER (ORDER BY Date)
FROM (
VALUES
(1, Date1),
(2, Date2),
(3, Date3),
(4, Date4)
) s (ID, Date)
WHERE Date IS NOT NULL
) s
)
FROM data
Here's the conclusion:
RecordID Date1 Date2 Date3 Date4 CheckDates
----------- ---------- ---------- ---------- ---------- ----------
1 2011-05-10 2011-08-16 NULL 2011-11-22 correct
2 NULL 2012-02-03 2012-02-27 2012-03-05 correct
3 2011-05-30 2011-05-11 2011-08-17 2011-09-15 incorrect
4 2011-05-30 NULL NULL NULL correct
The validation expression is more complex than in @njr's answer , but I think it pays off when you need to scale the script to support more columns: you just need to add new lines after the sentence VALUES.
source
share