Как суммировать данные по неделям в SQL 2000 - PullRequest
1 голос
/ 25 июня 2010

Как суммировать данные по неделям в MS-SQL 2000

У меня есть таблица «Отчеты» со следующими столбцами.

TotalSubmissions, ZoneID, RptMonth, RptDay, RptYear
2,1,6,1,2010
1,1,6,2,2010
1,1,6,3,2010
1,2,6,1,2010
1,2,6,2,2010
2,2,6,3,2010
1,2,6,4,2010
1,4,6,1,2010
1,4,6,3,2010
1,4,6,4,2010

Я хочу сделать отчет за неделю для конкретной зоны от DateRange1 до DateRange2

Пример: мне нужна суммаМудрости еженедельных представлений для zone2 с 01.06.2010 по 24.06.2010.

Пожалуйста, помогите мне выполнить вышеупомянутую задачу.

С уважением,

Mehboob KhanAfridi

Ответы [ 3 ]

2 голосов
/ 25 июня 2010

Я думаю, что это будет делать то, что вы хотите.

Я включил некоторые примеры данных для тестирования.

Create table #t
(
TotalSubmissions int,
ZoneId int,
RptMonth varchar(2),
RptDay varchar(2),
RptYear varchar(4)
)

Insert Into #t
Values (2,1,6,1,2010)
Insert Into #t
Values (1,1,6,2,2010)
Insert Into #t
Values (1,1,6,3,2010)
Insert Into #t
Values (1,2,6,1,2010)
Insert Into #t
Values (1,2,6,2,2010)
Insert Into #t
Values (2,2,6,3,2010)
Insert Into #t
Values (1,2,6,4,2010)
Insert Into #t
Values (1,4,6,1,2010)
Insert Into #t
Values (1,4,6,3,2010)
Insert Into #t
Values (1,4,6,4,2010)

declare @Date1 datetime,
        @Date2 datetime

Set @Date1 = '2010-06-01'
Set @Date2 = '2010-06-24'

Select  Sum(TotalSubmissions) as 'TotalSubmissions',
        ZoneId,
        DatePart(week, Cast((RptYear + '-' + RptMonth + '-' + RptDay) as datetime)) as 'WeekNumber',
        DatePart(year, Cast((RptYear + '-' + RptMonth + '-' + RptDay) as datetime)) as 'Year'

From #t
Where Cast((RptYear + '-' + RptMonth + '-' + RptDay) as datetime) >= @Date1
And Cast((RptYear + '-' + RptMonth + '-' + RptDay) as datetime) <= @Date2
Group By datepart(year,Cast((RptYear + '-' + RptMonth + '-' + RptDay) as datetime)),
        ZoneID, DatePart(week, Cast((RptYear + '-' + RptMonth + '-' + RptDay) as datetime))

drop table #t
1 голос
/ 25 июня 2010

Пример: мне нужна недельная сумма заявок для zone2 с 01.06.2010 по 24.06.2010.

Этот T-SQL должен это сделать:
(Я держал дату в одном месте, потому что «гггг-мм-дд» не является независимым от языка форматом даты.)

DECLARE
    @StartDate  DATETIME,
    @EndDate    DATETIME,
    @TargetZone INT

SET @StartDate  = '2010-06-01'
SET @EndDate    = '2010-06-24'
SET @TargetZone = 2


SELECT
    SUM (dwd.TotalSubmissions)      AS TotalSubmissions,
    dwd.ZoneID,
    DATEPART (week, dwd.ReportDate) AS WeekOfTheYear
FROM
    (
        SELECT
            r.TotalSubmissions,
            r.ZoneID,
            CAST ( (CAST (r.RptYear AS varchar(4)) + '-' + CAST (r.RptMonth AS varchar(2)) + '-' + CAST (r.RptDay AS varchar(2))) AS DATETIME)  AS ReportDate
        FROM
            Reports r
        WHERE
            r.ZoneID    = @TargetZone
    )
    AS dwd
WHERE
    dwd.ReportDate      >= @StartDate
AND
    dwd.ReportDate      <= @EndDate
GROUP BY
    dwd.ZoneID,
    DATEPART (year, dwd.ReportDate),
    DATEPART (week, dwd.ReportDate)

Образцы данных:

CREATE TABLE Reports
(
    TotalSubmissions    INT,
    ZoneID              INT,
    RptMonth            INT,
    RptDay              INT,
    RptYear             INT
)

INSERT INTO
    Reports (TotalSubmissions, ZoneID, RptMonth, RptDay, RptYear)
SELECT
    2, 1, 6, 1, 2010      UNION ALL SELECT
    1, 1, 6, 2, 2010      UNION ALL SELECT
    1, 1, 6, 3, 2010      UNION ALL SELECT
    1, 2, 6, 1, 2010      UNION ALL SELECT
    1, 2, 6, 2, 2010      UNION ALL SELECT
    2, 2, 6, 3, 2010      UNION ALL SELECT
    1, 2, 6, 4, 2010      UNION ALL SELECT
    1, 4, 6, 1, 2010      UNION ALL SELECT
    1, 4, 6, 3, 2010      UNION ALL SELECT
    1, 4, 6, 4, 2010    


INSERT INTO Reports (TotalSubmissions, ZoneID, RptMonth, RptDay,    RptYear)
SELECT               TotalSubmissions, ZoneID, RptMonth, RptDay+10, RptYear
FROM        Reports

INSERT INTO Reports (TotalSubmissions, ZoneID, RptMonth, RptDay,    RptYear)
SELECT               TotalSubmissions, ZoneID, RptMonth, RptDay+20, RptYear
FROM        Reports

DELETE FROM Reports
WHERE       RptDay > 30
0 голосов
/ 26 июня 2010

Какой день недели является началом вашей недели?

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

Вот решение, основанное на определении логина первого дня недели.

SELECT SUM(TotalSubmissions) AS TotalSubmissions,
       ZoneId, 
       DATEADD(DAY, -DATEPART(WEEKDAY, Cast(RptYear + '-' + RptMonth + '-' + RptDay AS DATETIME)) + 1,
        Cast(RptYear + '-' + RptMonth + '-' + RptDay AS DATETIME)) AS WeekBeginning

FROM Reorts

WHERE CAST(RptYear + '-' + RptMonth + '-' + RptDay AS DATETIME) >= '2010-06-01'
  AND CAST(RptYear + '-' + RptMonth + '-' + RptDay AS DATETIME) <= '2010-06-24'

GROUP BY ZoneId,
  DATEADD(DAY, -DATEPART(WEEKDAY, Cast(RptYear + '-' + RptMonth + '-' + RptDay AS DATETIME)) + 1,
    Cast(RptYear + '-' + RptMonth + '-' + RptDay AS DATETIME))
...