Как запустить Query в циклах и подсчитать количество строк в каждом цикле - PullRequest
0 голосов
/ 20 марта 2019

У меня есть запрос, который собирает данные для меня, в конце я фильтрую по двум датам и подсчитываю количество строк.

FROM TAB
WHERE
      (tab.transfer_date < '2019-03-11' AND  Real_Updated_date >= '2019-03-11') 
      ORDER BY transfer_date

Есть ли возможность увеличить обе датына «1» до «2019-03-20», подсчитать и напечатать, сколько строк у меня было в каждый день?Спасибо!

Полный запрос:

WITH TAB AS (
SELECT 

      [vortex_hvc].[vortex_dbo].material_history.updated_datetime
       ,[vortex_hvc].[vortex_dbo].material_history.transfer_date
      ,cast(
       case
            when  [vortex_hvc].[vortex_dbo].material_history.transfer_date = [vortex_hvc].[vortex_dbo].material_history.updated_datetime then getdate()
            else [vortex_hvc].[vortex_dbo].material_history.updated_datetime end as datetime
             ) as Real_Updated_date

  FROM [vortex_hvc].[vortex_dbo].[vw_public_material_location]

  join [vortex_hvc].[vortex_dbo].[vw_public_material_unit]
  on vw_public_material_location.material_name = vw_public_material_unit.unit_number

   JOIN [vortex_hvc].[vortex_dbo].[material_history] 
  ON [vortex_hvc].[vortex_dbo].vw_public_material_location.material_id = [vortex_hvc].[vortex_dbo].material_history.material_id
  where 

    DateDiff(d,[vortex_hvc].[vortex_dbo].material_history.transfer_date, getdate()) < 30
    AND
    [vortex_hvc].[vortex_dbo].vw_public_material_location.quantity = 1

    and
     [vortex_hvc].[vortex_dbo].material_history.location_id  in ('3492','3500','3981','3493','3504','3497','4140',
     '3498', '3496','3627','4378','3512','4376','4542','4379','3802','4517','4410','4182','4758','3499','4897','4239','4820',
     '4133','4377','4342','5042','5113','5358','5100','5550','5548','5549','5359',
     '5594','5601','5614','5696','5701')
     )

select tab.*
FROM TAB
where
      (tab.transfer_date < '2019-03-11' ANd  Real_Updated_date >= '2019-03-11') 
      order by transfer_date

1 Ответ

0 голосов
/ 20 марта 2019

Вы можете сделать что-то вроде этого:

DECLARE @dateFilter datetime, @enddate datetime
DECLARE @mycounts AS TABLE (mydate datetime, mycount int)
DECLARE @mydata AS TABLE (updated_datetime datetime, transfer_date datetime, real_updated_date datetime)

INSERT INTO @mydata
SELECT 

  [vortex_hvc].[vortex_dbo].material_history.updated_datetime
   ,[vortex_hvc].[vortex_dbo].material_history.transfer_date
  ,cast(
   case
        when  [vortex_hvc].[vortex_dbo].material_history.transfer_date = [vortex_hvc].[vortex_dbo].material_history.updated_datetime then getdate()
        else [vortex_hvc].[vortex_dbo].material_history.updated_datetime end as datetime
         ) as Real_Updated_date

  FROM [vortex_hvc].[vortex_dbo].[vw_public_material_location]

  join [vortex_hvc].[vortex_dbo].[vw_public_material_unit]
  on vw_public_material_location.material_name = vw_public_material_unit.unit_number

   JOIN [vortex_hvc].[vortex_dbo].[material_history] 
  ON [vortex_hvc].[vortex_dbo].vw_public_material_location.material_id = [vortex_hvc].[vortex_dbo].material_history.material_id
  where 

    DateDiff(d,[vortex_hvc].[vortex_dbo].material_history.transfer_date, getdate()) < 30
    AND
    [vortex_hvc].[vortex_dbo].vw_public_material_location.quantity = 1

    and
     [vortex_hvc].[vortex_dbo].material_history.location_id  in ('3492','3500','3981','3493','3504','3497','4140',
     '3498', '3496','3627','4378','3512','4376','4542','4379','3802','4517','4410','4182','4758','3499','4897','4239','4820',
     '4133','4377','4342','5042','5113','5358','5100','5550','5548','5549','5359',
     '5594','5601','5614','5696','5701')
     )

    SET @dateFilter = '2019-03-11' --this is the first date used as filter
    SET @enddate='2019-03-20' --this is the last one

    WHILE @dateFilter <= @enddate
    BEGIN
        INSERT INTO @mycounts

        SELECT @dateFilter, count(*) as mycount FROM @mydata tab
        WHERE
            (tab.transfer_date < @dateFilter AND  Real_Updated_date >= @dateFilter) 

        SET @dateFilter = DATEADD(day,1,@dateFilter)
    END

SELECT * FROM @mycounts

Используя DATEADD, вы также сможете фильтровать разные месяцы / годы.

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