Генерация отчетов по неделям между указанными датами в SQL Server - PullRequest
3 голосов
/ 29 декабря 2011

Мне нужно разделить отчет по рабочей неделе, а рабочая неделя - с понедельника по воскресенье.Допустим, я даю start_date как 01-12-2012 и end_date как 29-12-2011.Теперь я хочу разделить 1-4 числа как недели 1, 5-11 числа как недели 2, 12-18 числа как недели 3, 19-25 числа как недели 4, 26-29 числа как недели 5.

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

SELECT 
    ta.account, ta.customer, 

    isnull(sum(CASE WHEN (datepart(wk, ta.dt)- datepart(wk,dateadd(m, DATEDIFF(M, 0, ta.dt), 0))+ 1) = '1' 
THEN amount END),0) AS "1",

    isnull(sum(CASE WHEN (datepart(wk, ta.dt)- datepart(wk,dateadd(m, DATEDIFF(M, 0, ta.dt), 0))+ 1)= '2' 
    AND (datepart(dw,ta.dt)= 1)
    THEN amount END),0) AS "1",

    isnull(sum(CASE WHEN (datepart(wk, ta.dt)- datepart(wk,dateadd(m, DATEDIFF(M, 0, ta.dt), 0))+ 1)= '2' 
    AND (datepart(dw,ta.dt)<> 1)
    THEN amount END),0) AS "2",

    isnull(sum(CASE WHEN (datepart(wk, ta.dt)- datepart(wk,dateadd(m, DATEDIFF(M, 0, ta.dt), 0))+ 1)= '3' 
    AND (datepart(dw,ta.dt) = 1)    
    THEN amount END),0) AS "2",

    isnull(sum(CASE WHEN (datepart(wk, ta.dt)- datepart(wk,dateadd(m, DATEDIFF(M, 0, ta.dt), 0))+ 1)= '3' 
    AND (datepart(dw,ta.dt)<> 1)    
    THEN amount END),0) AS "3",

    isnull(sum(CASE WHEN (datepart(wk, ta.dt)- datepart(wk,dateadd(m, DATEDIFF(M, 0, ta.dt), 0))+ 1) = '4' 
    AND (datepart(dw,ta.dt) = 1)        
    THEN amount END),0) AS "3",

    isnull(sum(CASE WHEN (datepart(wk, ta.dt)- datepart(wk,dateadd(m, DATEDIFF(M, 0, ta.dt), 0))+ 1) = '4' 
AND (datepart(dw,ta.dt) <> 1)   
    THEN amount END),0) AS "4",

    isnull(sum(CASE WHEN (datepart(wk, ta.dt)- datepart(wk,dateadd(m, DATEDIFF(M, 0, ta.dt), 0))+ 1) = '5' 
    AND (datepart(dw,ta.dt) = 1)    
    THEN amount END),0) AS "4",

    isnull(sum(CASE WHEN (datepart(wk, ta.dt)- datepart(wk,dateadd(m, DATEDIFF(M, 0, ta.dt), 0))+ 1) = '5' 
    AND (datepart(dw,ta.dt) <> 1)   
    THEN amount END),0) AS "5"

FROM 
    (SELECT * FROM tablename
     WHERE dt >= '12/01/2011 00:00:00' AND dt < '12/26/2011 00:00:00'
    ) ta
GROUP BY 
    ta.account, ta.customer

Требуемое o / p:

Счет клиента неделя1 неделя2 неделя3 неделя4 неделя5

Для указанных выше дат неделя 1 должна быть 1-4-я неделя2 должна быть 5-11-й недели2 должна быть 12-18-я неделя2 должна быть 19-25-я неделя2 должна быть 26-го (январь 2012 г.)

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

Может случиться так, что клиент не сможет использовать его.Итак, в этом случае я хочу, чтобы в приведенном выше примере она равнялась 0,00, как и неделе 5.

Надеюсь, вы понимаете мой вопрос.Спасибо

1 Ответ

1 голос
/ 29 декабря 2011

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

SET DATEFIRST 1    
SELECT tn.account, tn.customer, SUM(amount), DATEPART(ww,tn.dt) WeekNumber
FROM tablename tn
WHERE dt >= '12/01/2011 00:00:00' 
      and dt < '12/26/2011 00:00:00'
GROUP BY ta.account, ta.customer, DATEPART(ww,tn.dt)

DATEPART возвращает целое число, представляющее указанную часть даты указанной даты.В этом случае номер недели в году.

SET DATEFIRST устанавливает первый день недели в число от 1 до 7, где 1 - понедельник, 2 - вторник и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...