如何插入依赖于多列sql的缺失数字

如何插入依赖于多列sql的缺失数字,sql,sql-server,Sql,Sql Server,我有一张这样的桌子: 你能看到的是,我缺少一个月号,是1。 我想在我的表中插入如下值: Month Year Col1 Forecast Customer 1 2015 HD/FB/BK/ 0 AFC 因为那是一个缺少的月份,所以我希望预测值为0 我的插入参数是按年份、col1和customer。首先,根据您的参数生成所有月份-年份组合的行。然后使用不存在插入缺少的行: DECLARE @yr INT,

我有一张这样的桌子:

你能看到的是,我缺少一个月号,是1。 我想在我的表中插入如下值:

Month  Year  Col1        Forecast   Customer
1      2015  HD/FB/BK/      0          AFC
因为那是一个缺少的月份,所以我希望预测值为0


我的插入参数是按年份、col1和customer。

首先,根据您的参数生成所有月份-年份组合的行。然后使用
不存在
插入缺少的行:

DECLARE @yr         INT,
        @col1       VARCHAR(50),
        @customer   VARCHAR(50);

WITH Cte(mnt, yr, col1, customer) AS(
    SELECT *, @yr, @col1, @customer
    FROM(VALUES
        (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)
    )t(N)
)
INSERT INTO tbl(Month, Year, Col1, Forecast, Customer)
    SELECT
        mnt,
        yr,
        col1,
        0,
        customer
    FROM Cte c
    WHERE
        NOT EXISTS(
            SELECT 1 
            FROM tbl
            WHERE
                Col1 = c.col1
                AND Customer = c.customer
                AND Month = c.mnt
                AND Year = c.yr
        )

这里的方法是生成
month
col1
的组合,并与当前表匹配,并为缺少的行生成insert。您可以使用
客户
年份
的其他所需组合来扩展此功能。如果没有针对特定组合的单个条目,则此操作非常有效

步骤1:创建组合表 步骤2:查找缺少的项目 步骤3:插入缺少的值(所有组合)
我不知道你丢失的号码。。12之后是第1个月,你所说的缺失数字是什么意思?正如我所说的,缺失的月份取决于每行、年份、col1和客户价值。您可以看到,我想插入缺失的月份,即1,根据2015年,col1:HD/FB/BK/和客户:AFC
SELECT 
    *
FROM
    (SELECT 1 month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12) months
        JOIN
    (SELECT 'HD/FB/BK' colname UNION ALL SELECT 'HD/FB/BL') col1
select expected.* from data_table dt right join (SELECT 
    *
FROM
    (SELECT 1 month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12) months
        JOIN
    (SELECT 'HD/FB/BK' colname UNION ALL SELECT 'HD/FB/BL') col1) expected on (dt.month = expected.month and dt.Col1 = expected.colname) where dt.col1 is null
insert into data_table
select datainsert.month, 2015, datainsert.colname, 0.0, 'AFC' FROM
(select expected.* from data_table dt right join (SELECT 
    *
FROM
    (SELECT 1 month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12) months
        JOIN
    (SELECT 'HD/FB/BK' colname UNION ALL SELECT 'HD/FB/BL') col1) expected on (dt.month = expected.month and dt.Col1 = expected.colname) where dt.col1 is null) datainsert;