SQL Server заполнить пустые строки - PullRequest
0 голосов
/ 17 декабря 2018

Добрый день,

У меня был интересный вопрос, который я хотел бы включить в сообщество переполнения стека.У нас есть набор данных в нашем хранилище данных (SQL Server) с уникальным идентификатором и несколько месяцев для этого уникального идентификатора.Например, если посмотреть на него в декабре 2018 года и увидеть эти строки ниже:

Row ID  BeginDate  EndDate       Unique ID   Amount
178484  2018-01-01 2018-01-31    GroupID1    387.22
176555  2018-03-01 2018-03-31    GroupID1    751.07
170120  2018-04-01 2018-04-30    GroupID1    567.48
172037  2018-09-01 2018-09-30    GroupID1    587.51
179024  2018-10-01 2018-10-31    GroupID1    63.42
182061  2018-11-01 2018-11-30    GroupID1    728.04

Нам бы хотелось как-то определить пропущенные строки (месяцы), которые отсутствуют.Например, для вышеупомянутого мы вставили бы следующие строки

  • Февраль, Май, Июнь, Июль, Август и Декабрь. Последним вводимым месяцем может быть дата запуска запроса.

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

Любая помощь будет по достоинству оценена.

Всего наилучшего, Джордж Эйваз

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Пожалуйста, попробуйте следующий скрипт, который использует NOT EXISTS, чтобы увидеть, удовлетворяет ли он вашим требованиям.

 ----drop table test 
    create table test (
    [Row ID] int ,
    BeginDate  date, 
    EndDate   date,
    [Unique ID]   varchar(15),
    Amount decimal(10,2)
    )
    insert into test values 
    (178484,'2018-01-01','2018-01-31','GroupID1',387.22),
    (176555,'2018-03-01','2018-03-31','GroupID1',751.07),
    (170120,'2018-04-01','2018-04-30','GroupID1',567.48),
    (172037,'2018-09-01','2018-09-30','GroupID1',587.51),
    (179024,'2018-10-01','2018-10-31','GroupID1',63.42),
    (182061,'2018-11-01','2018-11-30','GroupID1',728.04)

    select M as MonthNumber ,DATENAME(Month, DATEADD(Month, M, -1)) as  MonthName
    from (VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)) TT(M)
    where not exists (select * from test where TT.M=MONTH(BeginDate))
    /*
    MonthNumber MonthName
    ----------- ------------------------------
    2           February
    5           May
    6           June
    7           July
    8           August
    12          December
    */
0 голосов
/ 17 декабря 2018

Просто

SELECT M MonthNumber,
       DATENAME(Month, DATEADD(Month, M, -1)) MonthName
FROM T RIGHT JOIN 
     (VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)) TT(M)
ON MONTH(T.BeginDate) = TT.M
WHERE T.BeginDate IS NULL;

Возвраты:

+-------------+-----------+
| MonthNumber | MonthName |
+-------------+-----------+
|           2 | February  |
|           5 | May       |
|           6 | June      |
|           7 | July      |
|           8 | August    |
|          12 | December  |
+-------------+-----------+

Демо

...