A or B = (A and !B) or (!A and B) or (A and B)
To me, the relationship A or B = (A and !B) or (!A and B) or (A and B), though correct, seems overly complicated for this situation. Why not simplify this to A or B = A or (!A and B)?
In that case, the query would become as follows:
select p.Date, sum(p.PriceRetail)
from
(
select p.Date, sum(p.PriceRetail) as PriceRetail
from dbo.Purchase p with (index=ncci)
where p.Date = 20071114
group by p.Date
UNION ALL
where p.Date <> 20071114 and PriceId = 6
) as p
group by p.Date;
I don't have these tables so I can't test it, but I would expect this to be somewhat faster than the query above.