2015-05-12 3 views
-1

Я использую Sql Server 2012.день

Вот как рассчитать соотношение отказов в порядке:

31 дней Таблица 1 запрос

sum(CASE 
WHEN (datediff(dd,serDATE,'2015-01-21')) >= 31 THEN 31 
WHEN (datediff(dd,serDATE,'2015-01-21')) < 0 THEN 0 
ELSE (datediff(dd,serDATE,'2015-01-21'))END) as 31days 

1. Как цитировать и передавать даты динамически в Datediff?

31 Неудачи Таблица 2 запроса

SUM(Case when sometable.FAILUREDATE BETWEEN dateadd(DAY,-31,CONVERT(DATETIME, '2015-01-21 23:59:00.0', 102)) 
AND CONVERT(DATETIME, '2015-01-21 23:59:00.0', 102)Then 1 Else 0 END) As Failures31, 

31 день Cal (формула)

((365*(Convert(decimal (8,1),T2.Failures31)/T1.31day))) [31dayCal] 

Это хорошо работает, когда сделано для конкретного заказа.

Мне нужен аналогичный расчет, сделанный для мудрых дней и месяцев.

2. Какой подход следует использовать для достижения разумного и разумного расчета по месяцам?

У меня также есть таблица под названием Calender со списком дат, которые я могу использовать.

Я был бы очень признателен за любую помощь в отношении this..Thank вы ..

+0

Привет всем, пролил некоторый свет, пожалуйста, – Patchai

ответ

0

Решение

DECLARE @StartDate date = 'Jan 1, 2015' 
    DECLARE @EndDate date = DATEADD(DAY, 30, @StartDate) 

    ;WITH cte AS (
     SELECT  @StartDate AS ReportDate 
     UNION ALL 
     SELECT  DATEADD(DAY, 1, ReportDate) 
     FROM  cte 
     WHERE  ReportDate < @EndDate 
    ) 

    Select T1.[date],T1.Fail31,T2.days31, 
    ((365*(Convert(decimal (8,1),T1.Fail31)/T2.days31))) [31Fly] 

    from 
    (
    SELECT cte.ReportDate as [date], 

    SUM(Case when HISTORY.FAILUREDATE BETWEEN dateadd(DAY,-31,CONVERT(DATETIME, cte.ReportDate, 102)) 
    AND CONVERT(DATETIME, cte.ReportDate, 102)Then 1 Else 0 END) As Fail31 

     FROM HISTORY left JOIN UNIT ON HISTORY.UNIT = UNIT.UNIT 

     CROSS JOIN cte 

     WHERE 

      UNIT.INSV_DATE < cte.ReportDate 
        AND UNIT.MODEL in('Toyota') 
        AND(UNIT.Customer in('Jona')) 

        group by 

        cte.ReportDate ) T1 

        Inner Join 

        (SELECT cte.ReportDate as [date1], 


    COUNT(UNIT.UNIT) As Units, 

    sum(CASE 
    WHEN (datediff(dd,INSV_DATE,cte.ReportDate)) >= 31 THEN 31 
    WHEN (datediff(dd,INSV_DATE,cte.ReportDate)) < 0 THEN 0 
    ELSE (datediff(dd,INSV_DATE,cte.ReportDate))END) as days31 

     FROM UNIT 

     CROSS JOIN cte 

     WHERE 

      UNIT.INSV_DATE < cte.ReportDate 
        AND UNIT.MODEL in('Toyota') 
        AND(UNIT.Customer in('Jona')) 

        group by 

        cte.ReportDate 
    ) T2 on T1.[date] = t2.[date1] 
        Order by [date]