Поскольку вы хотите объединить несколько пробелов в один пробел, а затем удалить символы, которые не являются словами или пробелами, вы должны сделать это в двух отдельных подстановках регулярных выражений:
print(re.sub(r'[^0-9a-zA-Z ]+', '', re.sub(r'\s+', ' ', s)))
.
apple new A
SQL не "пропускает" даты..., потому что запросы работают против данных, которые находятся на самом деле в таблице. Так, если бы у Вас нет ДАТЫ в таблице на 14-е января, затем почему SQL показал бы Вам результат :)
То, что необходимо сделать, делают временную таблицу и СОЕДИНЯЮТ с ним.
CREATE TABLE #MyDates ( TargetDate DATETIME )
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 0, 101))
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 1, 101))
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 2, 101))
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 3, 101))
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 4, 101))
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 5, 101))
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 6, 101))
INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 7, 101))
SELECT CONVERT(VARCHAR, TargetDate, 101) AS Date, COUNT(*) AS OrderCount
FROM dbo.Orders INNER JOIN #MyDates ON Orders.Date = #MyDates.TargetDate
GROUP BY blah blah blah (you know the rest)
Вот так!
В зависимости от того, как SQL Server обрабатывает временные таблицы, можно ли более или менее легко расположить составить временную таблицу и заполнить ее с 7 (или было это 8?) даты Вы интересуетесь. Можно затем использовать это в качестве таблицы счета. Нет более чистого способа, о котором я знаю; можно только выбрать данные, которые существуют в таблице, или это может быть получено из данных, которые существуют в таблице или наборе таблиц. Если существуют даты, не представленные в таблице Orders, Вы не можете выбрать те даты из таблицы Orders.
Так как Вы захотите использовать эту таблицу даты часто в других запросах также, я предлагаю, чтобы Вы сделали ее постоянной таблицей и создали задание для добавления новогодних дат один раз в год.
Если вы хотите увидеть нулевое значение, то сделайте следующий запрос:
select count(*), sum(OrderAmount)
from Orders
where OrderDate>getdate()-7
and sum(OrderAmount) > 0 or sum(OrderAmount) = 0
group by datepart(day,OrderDate)