0

下午好,

我有一个有趣的问题,我想把堆栈溢出社区。我们的数据仓库 (SQL Server) 中有一个具有唯一标识符的数据集和几个月的唯一标识符。例如,如果有人在 2018 年 12 月查看它并看到以下这些行:

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

我们希望以某种方式识别缺失的行(月)。例如对于上面,我们将插入以下行

  • 二月、五月、六月、七月、八月和十二月 输入的最后一个月可以是运行查询的日期。

需要注意的是,这显然不是我们数据库中唯一的行分组。此外,我们会避免使用游标。我们已经尝试使用游标和包含所有有效值的临时表来执行此操作。但希望有一种更快的方法来解决这个问题。

对此的任何帮助将不胜感激。

一切顺利,乔治·艾瓦兹

4

2 回答 2

1

简单地

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  |
+-------------+-----------+

演示

于 2018-12-17T20:50:24.150 回答
0

请尝试以下使用 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
    */
于 2018-12-31T08:18:30.837 回答