2013-08-30 2 views
0

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

Я пытаюсь показать аналогичную таблицу ниже.

+-----------+-----+-------+--------+--+--+--+ 
| August |  | Count |  | | | | 
+-----------+-----+-------+--------+--+--+--+ 
| 8/1/2013 | Thu | 1,967 |  | | | | 
| 8/2/2013 | Fri | 1,871 |  | | | | 
| 8/3/2013 | Sat | 1,950 |  | | | | 
| 8/4/2013 | Sun | 2,013 | 7801 | | | | 
| 8/5/2013 | Mon | 2,039 |  | | | | 
| 8/6/2013 | Tue | 1,871 |  | | | | 
| 8/7/2013 | Wed | 1,611 |  | | | | 
| 8/8/2013 | Thu | 1,680 |  | | | | 
| 8/9/2013 | Fri | 1,687 |  | | | | 
| 8/10/2013 | Sat | 1,649 |  | | | | 
| 8/11/2013 | Sun | 1,561 | 12,098 | | | | 
+-----------+-----+-------+--------+--+--+--+ 

Пожалуйста, позвольте мне, если есть существующий код или технику, которые я мог бы достичь чего-то подобного. Благодарю.

Sherwin

+0

Вам необходимо использовать номер строки() и над разделом. Для получения дополнительной информации см. Следующую ссылку: http://www.codeproject.com/Articles/308281/How-to-Use-ROW_NUMBER-to-Enumerate-and-Partition-R – JsonStatham

ответ

2

Попробуйте что-то вроде этого, но убедитесь, чтобы проверить, какой день недели воскресенье на вашем сервере, так как это может быть изменен.

select T1.August, T1.[Count], 
case DATEPART(WEEKDAY, O.Order_Date) 
    WHEN 1 THEN (SELECT CONVERT(varchar(10), SUM(T2.[Count]) FROM TableName T2 WHERE T2.August BETWEEN DATEADD(d,-7,T1.August) and T1.August)) 
    ELSE '' 
end as Weekly_Count 
FROM TablleName T1 
ORDER BY T.August 
0

Если вы используете хранимые процедуры, а затем сделать временную таблицу и цикл его через с курсором, и сделать суммы. Вы также могли бы сделать что-то вроде этого:

SELECT CreatedDate, Amount, CASE WHEN DATENAME(dw , CreatedDate) = 'Sunday' THEN (SELECT SUM(Amount) FROM AmountTable at2 WHERE CreatedDate <= at1.CreatedDate AND CreatedDate > DATEADD(Day, -7, at1.CreatedDate)) ELSE 0 END AS 'WeekTotal' 
from AmountTable at1 
2

Если вы не против того, эти промежуточные итоги на новую строку, а не на новой колонке, GROUP BY WITH ROLLUP может быть решением для вас:

SET LANGUAGE GERMAN является используется для установки в понедельник первый день недели и позволяет нам не подводить до воскресенья

SET LANGUAGE GERMAN; 

WITH first AS 
(
    SELECT 
    date, 
    day, 
    DATEPART(dw, date) AS dayweek, 
    DATEPART(wk, date) AS week, 
    count 
    FROM example 
) 

SELECT 
    CASE WHEN (GROUPING(dayweek) = 1) THEN 'TOT' ELSE CAST(MAX(date) AS VARCHAR(20)) END AS date, 
    CASE WHEN (GROUPING(dayweek) = 1) THEN 'TOT' ELSE MAX(day) END AS day, 
    SUM(count) AS count 
FROM first 
GROUP BY week,dayweek WITH ROLLUP 

увидеть полный пример на sqlfiddle

+0

Привет, спасибо за предложение и ответ, я очень ценить это. Но кажется, что я действительно перехожу к новой колонке. Из-за некоторых требований, таких как Average, Daily Min и Daily Max. – Sherwin

0

Would что-то вдоль этих линий работают, синтаксис не может быть 100%

select 
[Date], 
DOW, 
[Count], 
Case When DOW = 'Mon' then 1 else 2 end as Partition_DOW, 
SUM([Count]) OVER (PARTITION BY (Case When DOW = 'Mon' then 1 else 0 end) ORDER BY [Date]) AS 'Monthly_Total' 
from My_table 
where Month([Date]) = Month(Date()) AND Year([Date]) = Year(Date())