2016-08-10 6 views
1

Добрый день! Я работаю над диаграммой, где мне нужно показать все дни текущей недели, чтобы показать продажи в неделю. Пока что я могу отображать все дни текущей недели, у меня просто возникают проблемы с отображением продаж за каждый день недели. Поскольку в базе данных нет дней в неделю, это столбец TOTAL_SALES должен вернуть значение Null. Вместо этого он возвращает общий объем продаж, записанный в базе данных. Вот мой запрос сохраненной процедуры.Выбрать все дни текущей недели

WITH DAYSOFTHEWEEK AS 
 
(
 
    SELECT 0 DAY 
 
    UNION ALL 
 
    SELECT DAY + 1 FROM DAYSOFTHEWEEK WHERE DAY < 6 
 
) 
 
SELECT DATEADD(DAY, DAY, DATEADD(DAY, 2-DATEPART(WEEKDAY, CONVERT (date, GETDATE())), CONVERT (date, GETDATE()))) AS DAY_OF_THE_WEEK, 
 
\t \t SUM([ORDER].NET_AMOUNT) AS TOTAL_SALES 
 
    FROM DAYSOFTHEWEEK, [ORDER] 
 
\t GROUP BY DAYSOFTHEWEEK.DAY

Я попытался добавить это условие заявление,

WHERE DAYSOFTHEWEEK.DAY IN ([ORDER].ORDER_DATE) 

Но он возвращает эту ошибку

Operand type clash: date is incompatible with int 

Может кто-то помочь мне в этом? Есть ли работать с кодом, который у меня уже есть? Заранее спасибо!

+0

Так что ваш 'ORDER' таблица' ORDER_DATE' и что-то вроде 'NET_AMOUNT'? Возможно, вы можете разместить некоторые данные образца? –

+0

В какой день вы хотите начать неделю? – Cato

+0

@LesH, у меня есть таблица с именем ORDER, у которой есть ORDER_DATE и NET_AMOUNT. –

ответ

1

То, что я думаю, что вы после того, как это SUM из каждого дня продажи за текущую неделю с NULL, если нет продаж. Секрет заключается в том, чтобы осталось присоединиться к списку дат на ваши данные:

-- Setup some fake sales data 
WITH TestData(N, Order_Date, Net_Amount) AS (
    SELECT 1 N, CAST(GETDATE() AS DATE) Order_Date, RAND() * 100 Net_Amount 
    UNION ALL 
    SELECT N+1 N, CAST(GETDATE()-N/5 AS DATE) Order_Date, RAND(CHECKSUM(NEWID())) * 100 Net_Amount FROM TestData 
    WHERE N < 20 
    ) 
SELECT TestData.Order_Date, TestData.Net_Amount INTO #Order FROM TestData 

--Set the first day of the week (if required) 
SET DATEFIRST 7 --Sunday 


;WITH Days(N,DayOfTheWeek) AS (
    SELECT 1 N, DATEADD(DAY, 1-DATEPART(WEEKDAY, GETDATE()), CONVERT(DATE,GETDATE())) DayOfTheWeek 
    UNION ALL 
    SELECT N+1 N,DATEADD(DAY, 1, DayOfTheWeek) DayOfTheWeek FROM Days 
    WHERE N < 7 
) 
SELECT d.DayOfTheWeek, SUM(Net_Amount) TotalAmount 
FROM Days d 
LEFT JOIN #Order ON d.DayOfTheWeek = Order_Date 
GROUP BY d.DayOfTheWeek 

DayOfTheWeek TotalAmount 
------------ ---------------------- 
2016-08-07 219.036784917497 
2016-08-08 273.319570812461 
2016-08-09 271.148114731087 
2016-08-10 194.780039228967 
2016-08-11 NULL 
2016-08-12 NULL 
2016-08-13 NULL 
+0

Это именно то, что мне нужно. Ваш запрос показывал неделю сегодня, начиная с 2016-08-07 (воскресенье), так же, как и то, что я хотел отобразить. –

0

Чуть более сложным для меня: Чтобы получить имя использования недели, например

SELECT DATENAME(dw,getdate())

Но вам действительно нужно что-то вроде этого:

SELECT ProductName,Sum(Sales) From NameOfTable GROUP BY 
DATENAME(ww,salesDate) 
+0

Все дело в том, что мне нужно выбрать все дни текущей недели. В вашем запросе отображается только текущий день недели. –

+0

Посмотрите следующий запрос ... DATENAME (ww, getDate()) предоставит вам номер недели для даты ввода. Таким образом, вы сможете группировать свои записи по неделям. –

+1

О, теперь я получаю: SELECT CAST (salesDate as DATE) as salesDay, ProductName, Sum (Sales) From NameOfTable GROUP BY CAST (salesDate as DATE) –

0

Вот каждый день на этой неделе, начиная с вашей даты первой даты, которая может быть временно изменена для запроса с помощью SET DATEFIRST, если вам нужно иметь дату начала другой недели

Я думаю, что у вас есть какие-то таблицы продаж там, что вы не показали нам, что вам нужно, чтобы присоединиться к тому, что на сегодняшний день, то группы по

WITH DAYSOFTHEWEEK AS 
(
    SELECT cast(dateadd(
         day, 
         -datepart(weekday,getdate()) + 1 , 
         GETDATE() 
         ) 
      as date) [DAY], 0 as cnt 
    UNION ALL 
    SELECT dateadd(day,1,[DAY]), cnt + 1 FROM DAYSOFTHEWEEK WHERE cnt < 6 
) 
select DAYSOFTHEWEEK.[day], SUM([ORDER].NET_AMOUNT) AS TOTAL_SALES from daysoftheweek 
               JOIN 
               SalesTable on 
            CAST(SalesTable.SalesDate date) = DAYSOFTHEWEEK.[day] 
          GROUP BY DAYSOFTHEWEEK.[day]