【问题标题】:TSQL - Populating values above and below an entry by referencing other columnsTSQL - 通过引用其他列填充条目上方和下方的值
【发布时间】:2016-06-29 12:29:36
【问题描述】:

我有一张桌子,看起来像:

这可以从下面的代码重新创建:

CREATE TABLE dbo.EmpnoProblem
(
DATE date NULL,
WORKNO nvarchar(50) NULL,
OPSEQ int NULL,
RELEASED nchar(10) NULL,
PRODUCT nvarchar(50) NULL,
EMPNO nvarchar(50) NULL
) ;

INSERT INTO [dbo].[EmpnoProblem] (DATE, WORKNO, OPSEQ, RELEASED, PRODUCT, EMPNO)
VALUES ('2016-06-16', '12345', 10, '10', '5454ABC', NULL);
INSERT INTO [dbo].[EmpnoProblem] (DATE, WORKNO, OPSEQ, RELEASED, PRODUCT, EMPNO)
VALUES ('2016-06-16', '12345', 20, '10', '5454ABC', NULL);
INSERT INTO [dbo].[EmpnoProblem] (DATE, WORKNO, OPSEQ, RELEASED, PRODUCT, EMPNO)
VALUES ('2016-06-16', '12345', 30, '10', '5454ABC', '345');
INSERT INTO [dbo].[EmpnoProblem] (DATE, WORKNO, OPSEQ, RELEASED, PRODUCT, EMPNO)
VALUES ('2016-06-16', '12345', 40, '10', '5454ABC', '345');
INSERT INTO [dbo].[EmpnoProblem] (DATE, WORKNO, OPSEQ, RELEASED, PRODUCT, EMPNO)
VALUES ('2016-06-16', '12345', 50, '10', '5454ABC', NULL);
INSERT INTO [dbo].[EmpnoProblem] (DATE, WORKNO, OPSEQ, RELEASED, PRODUCT, EMPNO)
VALUES ('2016-06-16', '12345', 60, '10', '5454ABC', NULL);
INSERT INTO [dbo].[EmpnoProblem] (DATE, WORKNO, OPSEQ, RELEASED, PRODUCT, EMPNO)
VALUES ('2016-06-16', '12345', 70, '10', '5454ABC', '698');
INSERT INTO [dbo].[EmpnoProblem] (DATE, WORKNO, OPSEQ, RELEASED, PRODUCT, EMPNO)
VALUES ('2016-06-16', '12345', 80, '10', '5454ABC', NULL);
INSERT INTO [dbo].[EmpnoProblem] (DATE, WORKNO, OPSEQ, RELEASED, PRODUCT, EMPNO)
VALUES ('2016-06-16', '12345', 90, '10', '5454ABC', NULL);

我需要填充 EMPNO 列。

当 3 列相同时:WORKNO、RELEASED、PRODUCT,我正在处理一个单独的分组,我的数据集由这些分组组成。

在这个分组中,如果一个 EMPNO 为空,那么首先它需要由下一个不为空的 EMPNO 填充(这可能是多个条目)。下一个 EMPNO 下降由 OPSEQ 编号确定。如果分组中没有不为空的 EMPNO(例如末尾的两个空条目),则需要由其上方的最后一个不为空的 EMPNO 填充。

表格应如下所示:

抱歉,我没有尝试代码。我不知道从哪里开始。任何指针都将不胜感激。

【问题讨论】:

  • 什么版本的sql-server?
  • 您将 OPSEQ 50 编码为 698,但根据您的要求,它将设置为 345。您需要稍微调整一下您的要求。如果你能弄清楚那个细节,这应该很容易完成。
  • 嘿乔,不应该是 698,因为我正在寻找下一个 EMPNO,而不是上面的那个。
  • 从 50 向下的下一个数字为空,您在这种情况下声明使用上面的数字。您必须指组中的任何一行,而不是下一行。
  • 对不起,我将编辑问题以使其更清楚。我的意思是说,如果在空值以下的任何级别都没有 EMPNO - 例如,最后的两个空值,请看上面的最后一个不为空的条目。在所有其他情况下,查找下一个不为空的 EMPNO 条目。

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

有多种方法可以解决这个问题。一个是 APPLY。

select 
    a.*,
    COALESCE(a.EMPNO,next_NONEMPTY_EMPNO.EMPNO,prev_NONEMPTY_EMPNO.EMPNO) EMPNO_Fixed
from #EmpnoProblem a
OUTER APPLY (
    select TOP 1
        EMPNO
    from #EmpnoProblem b
    where
        EMPNO is not null and
        a.WORKNO = b.WORKNO and
        a.RELEASED = b.RELEASED and
        a.PRODUCT = b.PRODUCT and
        b.OPSEQ > a.OPSEQ
    order by OPSEQ ASC
) next_NONEMPTY_EMPNO
OUTER APPLY (
    select TOP 1
        EMPNO
    from #EmpnoProblem b
    where
        EMPNO is not null and
        a.WORKNO = b.WORKNO and
        a.RELEASED = b.RELEASED and
        a.PRODUCT = b.PRODUCT and
        b.OPSEQ < a.OPSEQ
    order by OPSEQ DESC
) prev_NONEMPTY_EMPNO

【讨论】:

  • 我将如何执行此操作以确保它重置 WRKNO、PRODUCT、RELEASED 的每个新分组?在上面的数据中,我只展示了一个这样的分组。
  • @ColinO'Brien 抱歉错过了 =) 只需将其添加为加入键.. 已编辑。
【解决方案2】:

下面的代码可能会有所帮助。

第一次更新将使用下一个非空 EMPNO 填充 EMPNO

第二次更新将使用之前的非空 EMPNO 填充剩余的 EMPNO

与使用单个查询相比,在这种情况下使用两次更新将减少 IO。

UPDATE Dest
SET Dest.EMPNO=NewVal.EMPNO
FROM EmpnoProblem AS Dest
CROSS APPLY (SELECT TOP 1 Src.EMPNO FROM  EmpnoProblem AS Src WHERE Dest.WORKNO=Src.WORKNO AND Dest.RELEASED=Src.RELEASED AND Dest.PRODUCT=Src.PRODUCT AND Dest.OPSEQ<Src.OPSEQ AND Src.EMPNO IS NOT NULL ORDER BY Src.OPSEQ ASC) AS NewVal
WHERE Dest.EMPNO IS NULL;


UPDATE Dest
SET Dest.EMPNO=NewVal.EMPNO
FROM EmpnoProblem AS Dest
CROSS APPLY (SELECT TOP 1 Src.EMPNO FROM  EmpnoProblem AS Src WHERE Dest.WORKNO=Src.WORKNO AND Dest.RELEASED=Src.RELEASED AND Dest.PRODUCT=Src.PRODUCT AND Dest.OPSEQ>Src.OPSEQ AND Src.EMPNO IS NOT NULL ORDER BY Src.OPSEQ DESC) AS NewVal
WHERE Dest.EMPNO IS NULL;


SELECT *
FROM  dbo.EmpnoProblem
ORDER BY WORKNO,RELEASED,PRODUCT,OPSEQ

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    相关资源
    最近更新 更多