2016-06-10 4 views
0

У меня есть эта хранимая процедура, которая содержит некоторые данные инвентаризации и стандартный формат и не рассматривает отношения родитель-потомок. Это текущий вид данных вместе со многими другими столбцами:выравнивание данных родитель-ребенок

Я пытаюсь привести отношения родитель/ребенок в этом отчете. поэтому я изменил все запросы для ввода всех данных родителя/ребенка. Данные должны быть представлены определенным образом. рис ниже:

enter image description here

В принципе, нужно перечислить каждый родитель, сначала сопровождаемым все дочерние записями. Затем найдите эти записи для всех дочерних элементов в родительской строке.

the min of all child "1st Receipt Date", 
max of all child "Last Receipt Date", 
Sum of all child "On Hand" 
Sum of all child "Sales Unit" 
Mths Supply will be calculated from the total On Hand and Sales Units 

enter image description here

Я понятия не имею, как организовать данные в этой манере. Был бы очень признателен за какое-то направление.

Заранее спасибо.

+0

Иду с 160 в единицах продаж. Разве это не сумма? также как вы рассчитываете поставку #Mths? –

+0

Поцарапать вопрос 160, у меня была опечатка, вопрос о поставках на месяц по-прежнему стоит –

ответ

1
-- This Section is Just to Stage some Sample Data 
-------------------------------------------------------------------------------------------------------- 
Declare @Inv table (SKU int,FirstReceiptDate Date,LastReceiptDate Date,OnHand int,SalesUnits int) 
Insert Into @Inv (SKU,FirstReceiptDate,LastReceiptDate,OnHand,SalesUnits) values 
(456,'2014-03-15','2014-12-14',0,15), 
(789,'2014-05-30','2014-12-15',10,35), 
(321,'2014-07-31','2016-03-16',112,60) 

Declare @Hier table (SKU int,PtSKU int,PS int,Title varchar(50)) 
Insert into @Hier (SKU,PtSKU,PS,Title) values 
(123,0,0,'SKU Tile 123'), 
(456,123,10,'Some Other Title SKU 456'), 
(789,123,20,'This is the Title for Title SKU 786'), 
(321,123,30,'Finally Tile 321') 


-- This Section Builds the Hierarchy with Range Keys Hierarchies can be variable depth 
-- My hierarchies are pretty static so they are rebuilt as needed 
-- The real power is using the range key. You can aggregate data without 
-- a recursive query. 
-- I should not that I added a Presentation Sequence (PS) and Title to the Hierarcy 
-- The PS is used to control the presentation order. This can be alphabetical as well 
-------------------------------------------------------------------------------------------------------- 
;With cteOH (SKU,PtSKU,Lvl,PS,SortSeq) as 
    (
     Select SKU,PtSKU,Lvl=1,PS,cast([dbo].[udf-Str-PadL](PS,0,6) +':' +[dbo].[udf-Str-PadL](SKU,0,6) + '/' as varchar(500)) from @Hier where PtSKU=0 
     Union All 
     Select h.SKU,h.PtSKU,cteOH.Lvl+1,h.PS,SortSeq=cast(cteOH.SortSeq + [dbo].[udf-Str-PadL](H.PS,0,6) +':' +[dbo].[udf-Str-PadL](H.SKU,0,6) + '/' as varchar(500)) FROM @Hier h INNER JOIN cteOH ON h.PtSKU = cteOH.SKU 
    ) 
    ,cteR1 as (Select SKU,SortSeq,R1=Row_Number() over (Order by SortSeq) From cteOH) 
    ,cteR2 as (Select A.SKU,R2 = max(B.R1) From cteOH A Join cteR1 B on (B.SortSeq Like A.SortSeq+'%') Group By A.SKU) 
    Select B.R1 
      ,C.R2 
      ,A.Lvl 
      ,A.SKU 
      ,A.PtSKU 
      ,A.PS 
      ,T.Title 
    Into #TempOH 
    From cteOH A 
    Join cteR1 B on (A.SKU=B.SKU) 
    Join cteR2 C on (A.SKU=C.SKU) 
    Join @Hier T on (A.SKU=T.SKU) 
    Order By B.R1 


-- This Section illustrates how to aggregate data via the range keys 
-------------------------------------------------------------------------------------------------------- 
Select A.* 
     ,FirstReceiptDate  = min(B.FirstReceiptDate) 
     ,LastReceiptDate  = max(B.LastReceiptDate) 
     ,OnHand     = sum(B.OnHand) 
     ,SalesUnits    = sum(B.SalesUnits) 
     ,MonthsSupply   = cast(sum(B.OnHand*12.)/sum(B.SalesUnits) as money) 
     ,FamilyFirstReceiptDate = First_Value(min(B.FirstReceiptDate)) Over (Order By A.R1) 
     ,FamilyLastReceiptDate = First_Value(max(B.LastReceiptDate)) Over (Order By A.R1) 
     ,FamilyOnHand   = First_Value(sum(B.OnHand))   Over (Order By A.R1) 
     ,FamilySalesUnits  = First_Value(sum(B.SalesUnits))  Over (Order By A.R1) 
     ,FamilyMonthsSupply  = First_Value(cast(sum(B.OnHand*12.)/sum(B.SalesUnits) as money))  Over (Order By A.R1) 
From #TempOH A 
Join (Select _R1=B.R1,A.* From @Inv A Join #TempOH B on A.SKU=B.SKU) B on _R1 between A.R1 and A.R2 
Group By A.R1,A.R2,A.Lvl,A.SKU,A.PtSKU,A.PS,A.Title 
Order By A.R1 

Возвращает

R1     R2     Lvl   SKU   PtSKU  PS   Title            FirstReceiptDate LastReceiptDate OnHand  SalesUnits MonthsSupply   FamilyFirstReceiptDate FamilyLastReceiptDate FamilyOnHand FamilySalesUnits FamilyMonthsSupply 
-------------------- -------------------- ----------- ----------- ----------- ----------- -------------------------------------------------- ---------------- --------------- ----------- ----------- --------------------- ---------------------- --------------------- ------------ ---------------- --------------------- 
1     4     1   123   0   0   SKU Tile 123          2014-03-15  2016-03-16  122   110   13.3091    2014-03-15    2016-03-16   122   110    13.3091 
2     2     2   456   123   10   Some Other Title SKU 456       2014-03-15  2014-12-14  0   15   0.00     2014-03-15    2016-03-16   122   110    13.3091 
3     3     2   789   123   20   This is the Title for Title SKU 786    2014-05-30  2014-12-15  10   35   3.4286    2014-03-15    2016-03-16   122   110    13.3091 
4     4     2   321   123   30   Finally Tile 321         2014-07-31  2016-03-16  112   60   22.40     2014-03-15    2016-03-16   122   110    13.3091 

Требуемая функция

CREATE FUNCTION [dbo].[udf-Str-PadL] (@Value varchar(50),@Pad varchar(10) = '0',@Len int = 10) 

-- Syntax : Select [dbo].[udf-Str-PadL](25,0,10) 
-- Syntax : Select [dbo].[udf-Str-PadL](25,'-',6) 

Returns varchar(50) 
AS 
    BEGIN 
    Return right(concat(Replicate(@Pad,@Len),@Value),@Len) 
    END 
+0

Привет, Джон, Спасибо за ваш ответ с решением. Не могли бы вы объяснить это «[dbo]. [Udf-Str-PadL]» - это функция, которую вы вызываете? – Eclipse

+0

Приношу свои извинения. Я не смог включить эту функцию. Я изменю свой ответ, чтобы включить функцию. –

+0

Спасибо за добавление функции. Мои структуры таблиц немного отличаются друг от друга и имеют очень сложный запрос, который извлекает текущие данные. Каков наилучший способ показать вам, что у меня есть сейчас, включая данные? – Eclipse

Смежные вопросы