Разделить запись на несколько строк записи - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть таблица, как показано ниже. Основная таблица

ID      Name
1       Bubble

Дочерняя таблица

ID   MasterTableID   StartDate       EndDate       Qty      UnitMeasurement     
1    1                1/2/2019        1/6/2019    1000         sqft
2    1                1/2/2019        1/4/2019    3000         sqft

Мне нужно выбрать запись выше и показать ее в 5 строках, начиная с 1/2 - 1 /6 были 5 месяцев.

 Date       Qty      
1/2/2019    200   
1/3/2019    200
1/4/2019    200
1/5/2019    200
1/6/2019    200

Запись второй строки в 3 строки записи

Date       Qty      
1/2/2019    1000   
1/3/2019    1000
1/4/2019    1000

Я использую SQL Server.

Могу ли я знать, что возможносделать так?

Ответы [ 3 ]

1 голос
/ 04 ноября 2019

Вы можете использовать Recursively + CTE и фильтровать, используя inner join on id

CREATE TABLE T
  ([ID] int, [MasterTableID] int, [StartDate] datetime, [EndDate] datetime, [Qty] int, [UnitMeasurement] varchar(4))
;

INSERT INTO T
  ([ID], [MasterTableID], [StartDate], [EndDate], [Qty], [UnitMeasurement])
VALUES
  (1, 1, '2019-01-02 00:00:00', '2019-01-06 00:00:00', 1000, 'sqft'),
  (2, 1, '2019-01-02 00:00:00', '2019-01-04 00:00:00', 3000, 'sqft')
;

GO
2 rows affected
with cte as (
  select [EndDate] as [Date],ID,datediff(day,[StartDate], [EndDate]) diff , [Qty] / (datediff(day,[StartDate], [EndDate]) + 1) as qty
  from T
  union all
  select dateadd(day,-1,[Date]) [Date],T1.ID,T2.diff - 1 as diff,T2.qty 
  from T T1
  inner join cte T2 on T1.ID = T2.ID
  where diff >0
)
select ID,[Date],qty  
from cte
order by ID,[Date]
GO
ID | Date                |  qty
-: | :------------------ | ---:
 1 | 02/01/2019 00:00:00 |  200
 1 | 03/01/2019 00:00:00 |  200
 1 | 04/01/2019 00:00:00 |  200
 1 | 05/01/2019 00:00:00 |  200
 1 | 06/01/2019 00:00:00 |  200
 2 | 02/01/2019 00:00:00 | 1000
 2 | 03/01/2019 00:00:00 | 1000
 2 | 04/01/2019 00:00:00 | 1000

дБ <> скрипка здесь

0 голосов
/ 04 ноября 2019

Это достижимо при использовании cte. поскольку ваш формат даты ddMMyyy, нам нужно преобразовать его в MMddyyy, чтобы мы могли использовать dateadd(month...

CREATE TABLE #Temp
  (id int, [StartDate] varchar(30), [EndDate] varchar(30), [Qty] int, [UnitMeasurement] varchar(4))
;

INSERT INTO #Temp
  (id, [StartDate], [EndDate], [Qty], [UnitMeasurement])
VALUES
  (1, '1/2/2019', '1/6/2019', 1000, 'sqft'),
  (2, '1/2/2019', '1/4/2019', 3000, 'sqft')
;
GO

with cte as
(
    Select  id, cast(convert(varchar
    , convert(datetime, [StartDate], 103), 101) as date) as startdate
        , cast(convert(varchar
    , convert(datetime, [EndDate], 103), 101) as date) as enddate
    , [Qty] 
    , 1 as ctr from #Temp   
    union all
    Select  id, dateadd(month, 1, startdate), enddate, qty, ctr + 1
    From    cte
    Where   startdate < enddate
)
Select t1.id, qty/t2.ct, startdate from cte t1
cross apply (select count(1) ct, id from cte group by id) t2
where t2.id = t1.id

order by t1.id asc
Option  (MaxRecursion 0)

drop table #Temp

output :

enter image description here

0 голосов
/ 04 ноября 2019

попробуйте, как показано ниже, для создания даты

 DECLARE @StartDate DATE = '1/2/2019'
  , @EndDate DATE = '1/6/2019'

SELECT  DATEADD(DAY, nbr - 1, @StartDate)
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY c.object_id ) AS Nbr
          FROM      sys.columns c
        ) nbrs
WHERE   nbr - 1 <= DATEDIFF(DAY, @StartDate, @EndDate)

или вы можете использовать рекурсию

Declare  @FromDate    Date = '1/2/2019',
         @ToDate      Date = '1/6/2019'

;With DateCte (Date) As
(
    Select  @FromDate Union All
    Select  DateAdd(Day, 1, Date)
    From    DateCte
    Where   Date <= @ToDate
)
Select  Date
From    DateCte
Option  (MaxRecursion 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...