2015-05-20 2 views
-1

Я создал новую тему, поскольку я пытаюсь разделить свой первоначальный вопрос на несколько частей.Дата передачи динамически для запроса для вычисления суточных результатов

Начальная тема может быть найдена в следующих link.

Я создал ссылку SQL Fiddle с данными таблицы и образца.

Это запрос, который у меня есть прямо сейчас.

SELECT 
    Order1, 
    COUNT(UNit.UNIT) AS Units, 
    SUM(CASE 
    WHEN (DATEDIFF(dd, INSV_DATE, '2015-01-21')) >= 31 THEN 31 
    WHEN (DATEDIFF(dd, INSV_DATE, '2015-01-21')) < 0 THEN 0 
    ELSE (DATEDIFF(dd, INSV_DATE, '2015-01-21')) 
    END) AS Days31 
FROM UNIT 
WHERE Unit.INSV_DATE < '2015-01-21' 
AND UNIT.MODEL IN ('Toyota') 
AND (UNIT.Customer IN ('Jona')) 
GROUP BY [Order1], 
     customer 

как КОНТУР и даты проходит динамически в DATEDIFF в течение одного месяца?

Я хочу, чтобы 31-дневный выход рассчитан на день.

Результат должен быть, как

Date | Order1 | Unit | Day31 
---------------------------------- 
May20 | 90909 | 5  | 128 
May19 | 90909 | 4  | 124 
May17 | 90909 | 2  | 62 

Я действительно хочу сделать что-то вроде следующего.

SELECT 
    Order1, 
    COUNT(UNit.UNIT) AS Units, 
    SUM(CASE 
    WHEN (DATEDIFF(dd, INSV_DATE, '2015-05-20')) >= 31 THEN 31 
    WHEN (DATEDIFF(dd, INSV_DATE, '2015-05-20')) < 0 THEN 0 
    ELSE (DATEDIFF(dd, INSV_DATE, '2015-05-20')) 
    END) AS Days31 
FROM UNIT 
WHERE Unit.INSV_DATE < '2015-05-20' 
AND UNIT.MODEL IN ('Toyota') 
AND (UNIT.Customer IN ('Jona')) 
GROUP BY [Order1], 
     customer 

SELECT 
    Order1, 
    COUNT(UNit.UNIT) AS Units, 
    SUM(CASE 
    WHEN (DATEDIFF(dd, INSV_DATE, '2015-05-19')) >= 31 THEN 31 
    WHEN (DATEDIFF(dd, INSV_DATE, '2015-05-19')) < 0 THEN 0 
    ELSE (DATEDIFF(dd, INSV_DATE, '2015-05-19')) 
    END) AS Days31 
FROM UNIT 
WHERE Unit.INSV_DATE < '2015-05-19' 
AND UNIT.MODEL IN ('Toyota') 
AND (UNIT.Customer IN ('Jona')) 
GROUP BY [Order1], 
     customer 

SELECT 
    Order1, 
    COUNT(UNit.UNIT) AS Units, 
    SUM(CASE 
    WHEN (DATEDIFF(dd, INSV_DATE, '2015-05-18')) >= 31 THEN 31 
    WHEN (DATEDIFF(dd, INSV_DATE, '2015-05-18')) < 0 THEN 0 
    ELSE (DATEDIFF(dd, INSV_DATE, '2015-05-18')) 
    END) AS Days31 
FROM UNIT 
WHERE Unit.INSV_DATE < '2015-05-18' 
AND UNIT.MODEL IN ('Toyota') 
AND (UNIT.Customer IN ('Jona')) 
GROUP BY [Order1], 
     customer 

Выполнение этого запроса на каждый день с другой датой.

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

+0

Вы пытаетесь получить сумму единиц, «проданных» каждый день, а затем отображать общий объем производства до того дня, в котором вы находитесь? – FutbolFan

ответ

0

Вы можете создать список дат с использованием рекурсивного ОТВ, то CROSS JOIN его против вашей таблицы, чтобы получить список дней вы хотите:

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 Order1,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 [Order1],customer 
+0

Спасибо, Zoff Dino. Это сработало. – Patchai

0

Основываясь на моем понимании того, что вы хотите, вот мой «догадка»:

DECLARE @startDate DATE = CAST(MONTH(GETDATE()) AS VARCHAR) + '/' + '01/' + + CAST(YEAR(GETDATE()) AS VARCHAR) -- cast as mm/dd/yyyy 
DECLARE @endDate DATE = GETDATE() -- mm/dd/yyyy 

--creates a list of dates for the running month 
;WITH month_dates 
AS (
    SELECT [Date] = DATEADD(Day, Number, @startDate) 
    FROM master.dbo.spt_values 
    WHERE Type = 'P' 
     AND DATEADD(day, Number, @startDate) <= @endDate 
    ) 
SELECT month_dates.[Date] 
    ,Order1 
    ,COUNT(UNit.UNIT) AS Units 
    ,sum(CASE 
      WHEN (datediff(dd, INSV_DATE, month_dates.[Date])) >= 31 
       THEN 31 
      WHEN (datediff(dd, INSV_DATE, month_dates.[Date])) < 0 
       THEN 0 
      ELSE (datediff(dd, INSV_DATE, month_dates.[Date])) 
      END) AS Days31 
FROM UNIT 
CROSS JOIN month_dates    --cross join list of dates 
WHERE Unit.INSV_DATE < month_dates.[Date] 
    AND UNIT.MODEL IN ('Toyota') 
    AND (UNIT.Customer IN ('Jona')) 
    AND UNIT.Order1 = 'A1056729' --added this filter to test the output 
GROUP BY month_dates.[Date] 
    ,[Order1] 
    ,customer 
ORDER BY month_dates.[Date] desc 
Смежные вопросы