Суммы записей на основе даты, попадающей в диапазон из таблицы поиска - SQL Server - PullRequest
0 голосов
/ 14 марта 2019

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

IF OBJECT_ID('tempdb..#DateRanges') IS NOT NULL DROP TABLE #DateRanges
Create Table #DateRanges
 (Start_num int, End_Num int, Day_Period varchar(10), Day_Bin varchar(8))

 Insert Into #DateRanges
 Values (0,-6,'7Day', 'Current'),
        (-7,-13,'7Day','1'),
        (-14,-20,'7Day','2'),
        (-21,-27,'7Day','3'),
        (-28,-34,'7Day','4'),
        (0,-27,'28Day','Current'),
        (-28,-55,'28Day','1'),
        (-56,-83,'28Day','2'),
        (-84,-111,'28Day','3'),
        (-112,-139,'28Day','4'),
        (0,-83,'84Day','Current'),
        (-84,-167,'84Day','1'),
        (-168,-251,'84Day','2'),
        (-252,-335,'84Day','3'),
        (-336,-419,'84Day','4'),
        (0,-363,'364Day','Current'),
        (-364,-727,'364Day','1'),
        (-728,-1091,'364Day','2'),
        (-1092,-1455,'364Day','3'),
        (-1456,-1819,'364Day','4')

Следующий запрос пытается запросить мою RMS и использовать приведенную выше таблицу для суммирования записей

select 
  'category' as n_Group, 
   ab2.ItemCategory as Item,
   DLU.Day_Period, 
   DLU.Day_Bin, 
   sum(g.occ_date Between DateAdd("d",DLU.end_num,@Date1) AND DateAdd   ("d",DLU.start_Num,@Date1)) as n_Count

FROM g_data g
     left join LUab ab2
        on g.ext= ab2.ext,
     #DateRanges DLU

Where g.occ_date Between DateAdd("d", -1819, @Date1) and  @Date1

Group By
    ab2.ItemCategory,
    DLU.Day_Period,
    DLU.Day_Bin

Другой пользователь помог в создании по вышеуказанному запросу, но это было для MS Access. Я изменил механизм и сейчас пытаюсь выполнить эту часть проекта в SQL Server, а следующая строка не совместима с SQL Server. sum(g.occ_date Between DateAdd("d",DLU.end_num,@Date1) AND DateAdd("d",DLU.start_Num,@Date1)) as n_Count.

Неправильная синтаксическая ошибка показывает последнюю скобку в строке суммы. В своей работе я попытался Count(iif(g.occ_date Between DateAdd("d",DLU.end_num,@Date1) AND DateAdd("d",DLU.start_Num,@Date1)), g.rin) as n_Count, и запрос был выполнен, но вернул n_count итоговые значения, которые, возможно, считали категорию во всех среднеквадратичных значениях. Case When g.occ_date Between DateAdd("d",DLU.end_num,@Date1) AND DateAdd("d",DLU.start_Num,@Date1) then 1 else 0 End as n_Count вернул те же результаты при подсчете iif

Ниже приведены примеры данных (санированные), полученные в результате запроса примера ... Мои извинения за форматирование, я выполнил поиск по разделам справки и не смог найти лучший метод. ItemType и ItemDesc являются подкатегориями и будут суммироваться так же, как ItemCategory с объединенными запросами

occ_date ItemCategory Itemetype ItemDesc randnum 11/10/2011 A AS AAS 1.01E-07 1/21/2015 V VV VVA 1.02E-07 3/6/2001 L LP LLP 3.85E-07 8/25/2017 L LS LLS 4.41E-07 12/7/2008 C CC CCC 5.62E-07 2/28/2009 V VV VVA 6.54E-07 6/24/2012 M MM MMM 6.76E-07 6/26/2006 A AA AAA 9.86E-07 3/1/1994 Q QQ QQP 1.11E-06 1/9/2018 M MM MMM 1.55E-06 11/6/1992 T TA TTA 2.00E-06 6/3/2009 V VV VVV 2.18E-06 10/26/1996 M MM MMM 2.28E-06 1/21/2017 M MM MMM 2.34E-06 3/28/2012 N NN NN 2.35E-06 5/1/1999 M MM MMM 2.52E-06 6/1/2014 S SR SSR 2.87E-06 10/2/2016 V VV VVV 2.91E-06 8/5/1988 C CC CCC 3.33E-06 4/6/2018 N NN NNN 3.34E-06

1 Ответ

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

Спасибо за #DateRanges.Пожалуйста, запустите следующее и вставьте полученный файл данных выше.Это даст нам некоторые тестовые данные для работы с вашим решением.

Select TOP 20 *  From (
    Select Top 5000
       g.occ_date
      ,g.ext
      ,ab2.ItemCategory
      , RAND(convert(varbinary, newid())) as randnum
    FROM      g_data g
    left join LUab ab2
            on g.ext= ab2.ext
    order by randnum
    ) zz

позже в тот же день ... попробуйте это.Я просто изменил СУММУ на СЧЕТ (*) и переместил «Между DLU ...», чтобы он стал Где… И ...

select 
  'category' as n_Group, 
   ab2.ItemCategory as Item,
   DLU.Day_Period, 
   DLU.Day_Bin, 
   count(*)  as n_Count

FROM g_data g
     left join LUab ab2
        on g.ext= ab2.ext,
     #DateRanges DLU

Where g.occ_date Between DateAdd("d", -1819, @Date1) and  @Date1
and (g.occ_date Between DateAdd("d",DLU.end_num,@Date1) AND DateAdd   ("d",DLU.start_Num,@Date1))

Group By
    ab2.ItemCategory,
    DLU.Day_Period,
        DLU.Day_Bin

3/14 13:45 Вот мои результаты, используя @ Date1 из 01.03.2009.Все остальные даты слишком древние.Что вы получаете?Как должны выглядеть результаты?

n_Group Item    Day_Period  Day_Bin n_Count
category    L   364Day         1    1
category    M   364Day         1    1
category    M   364Day         2    1
category    M   84Day          4    1
category    N   364Day     Current  1
category    N   84Day          3    1
category    S   364Day         4    1
category    V   364Day         2    1
category    V   364Day         4    1
...