2016-09-26 4 views
2

В настоящее время я пытаюсь построить логику, которая будет независимо суммировать каждый день недели на текущую неделю, учитывая день запуска отчета. Мне нужно выяснить, как построить запрос для агрегирования каждого дня (и общей еженедельной суммы) в виде отдельных столбцов.Как суммировать итоговые данные за данную неделю и каждый соответствующий день недели?

Ниже я только при условии, что подзапросы я хотел бы использовать для Total и воскресенье:

DECLARE 
@SundayOfCurrentWeek date 
, @MondayOfCurrentWeek date 
, @TuesdayOfCurrentWeek date 
, @WednesdayOfCurrentWeek date 
, @ThursdayOfCurrentWeek date 
, @FridayOfCurrentWeek date 
, @SaturdayOfCurrentWeek date 
set @SundayOfCurrentWeek = DATEADD(wk, DATEDIFF(wk,0,getdate()), -1) 
set @MondayOfCurrentWeek = DATEADD(wk, DATEDIFF(wk,0,getdate()), 0) 
set @TuesdayOfCurrentWeek = DATEADD(wk, DATEDIFF(wk,0,getdate()), 1) 
set @WednesdayOfCurrentWeek = DATEADD(wk, DATEDIFF(wk,0,getdate()), 2) 
set @ThursdayOfCurrentWeek = DATEADD(wk, DATEDIFF(wk,0,getdate()), 3) 
set @FridayOfCurrentWeek = DATEADD(wk, DATEDIFF(wk,0,getdate()), 4) 
set @SaturdayOfCurrentWeek = DATEADD(wk, DATEDIFF(wk,0,getdate()), 5) 

/** Выбор Всего записей в пределах недели **/

(select count(*) 
from release 
where releasetime >= @SundayOfCurrentWeek 
AND releasetime <= @SaturdayOfCurrentWeek) as TotalCount 

/** Выберите Все записи по состоянию на воскресенье **/

(select count(*) as SundayCount 
from release 
where releasetime >= @SundayOfCurrentWeek 
AND releasetime < @MondayOfCurrentWeek) as SundayCount 

ответ

1
;WITH cte AS (
    SELECT 
     DATENAME(dw,releasetime) as DayOfWeekName 
     ,COUNT(*) OVER() as TotalCount 
    FROM 
     @release 
    WHERE 
     releasetime >= DATEADD(DAY,- DATEPART(dw,GETDATE()) + 1,CAST(GETDATE() AS DATE)) 
     AND releasetime < DATEADD(DAY,7 - DATEPART(dw,GETDATE()) + 1,CAST(GETDATE() AS DATE)) 
) 

SELECT * 
FROM 
    cte 
    PIVOT (
     COUNT(DayOfWeekName) 
     FOR DayOfWeekName IN (Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday) 
    ) p 

Много разных способов сделать это. Я предположил, что вы хотите, чтобы результаты приводили значение в столбцах с днем ​​недели, а не в строках. Поэтому я показываю вам один из способов, чтобы сделать ваши результаты. Вы также можете использовать условную агрегацию, как в другом ответе. Трюк с Pivot - это подготовка таблицы, которую вы хотите сначала, а затем поворот. Это можно сделать с помощью обычного табличного выражения [cte]. Затем, используя функции окна, вы можете легко добраться до своего COUNT (*) для общего количества или даже счетного счета.

TotalCount COUNT(*) OVER() --номер без перегородки и без порядка по простому подсчету результата.

Работающий счетчик может выглядеть примерно так:

COUNT(*) OVER (ORDER BY DATEPART(dw,releasetime)) 

Определенно рекомендуется ознакомиться с оконными функциями!

Редактировать, изменил сравнение даты в инструкции where. Он автоматически определит воскресенье текущей недели, а затем в воскресенье следующей недели. Причиной воскресенья следующей недели я переключил его с <= на <, потому что SQL Server будет округлять что-нибудь выше 23: 59: 59.997 до 00: 00: 00.000 на следующий день, когда вам нужно либо сделать дату окончания в полночь субботы, имеет компонент времени, или вы делаете это 12 AM на следующий день и говорите меньше.

-1

Попробуйте это ...

SELECT 
DATEPART(DW, [date_col]) AS 'Day_of_Week', 
COUNT(*) AS 'Count_per_Day' 
FROM [Table] 
GROUP BY DATEPART(DW, [date_col]) 

Обратите внимание, что Day_of_Week = 1 на воскресенье, 7 на субботу.

Смежные вопросы