2016-06-29 4 views
5

を参照することにより、エントリの上および下の値を移入I持っているように見えるテーブル:TSQL - 他の列

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); 

I:これは、以下のコードから再作成することができる

enter image description here

EMPNO列に値を設定する必要があります。

3列が同じである

:WORKNOリリースし、製品は、私は、個々のグループ化を扱っていますし、私のデータセットは、これらのグループで構成されています。このグループ内

、EMPNOは、まず、それがnullではない次EMPNOダウン(これはダウンいくつかのエントリであってもよい)によって移入される必要がヌルである場合。次のEMPNOダウンはOPSEQ番号によって決まります。ヌルさらに下(例えば、末端に2つのヌルのエントリなど)のグループにはない全くEMPNOがない場合、それがnullではない、それ以上の最終EMPNOによって移入される必要があります。

の表は、次のようになります。私の最後のコードの試みの欠如のため

enter image description here

謝罪。私はこれでどこから始めるべきかわからない。どのポインターでも大いに感謝します。

+0

SQLサーバのバージョンは何? – mxix

+0

SQL Server 2012 –

+0

OPSEQ 50は698としてコード化されていますが、要件に応じて345に設定されます。要件を微調整する必要があります。あなたがその細部を理解することができれば、これは簡単に達成できるはずです。私は次のEMPNOダウンではなく、上記の1を探しているよう –

答えて

4

これを解決するために、複数の方法があります。 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 
+0

WRKNO、PRODUCT、RELEASEDの新しいグループをすべてリセットするにはどうすればいいですか?上記のデータでは、そのようなグループを1つだけ示しています。 –

+1

@ ColinO'Brienごめんなさい=)は、それを結合キーとして追加するだけです。編集しました。 – mxix

1

以下のコードが役立ちます。

まず更新は、使用と比較した場合、IOを削減するこのシナリオでは2回の更新を使用して、以前のないヌルEMPNO

を使用して残りのEMPNOを移入するわけではないヌルEMPNOを次

更新を使用してEMPNOを移入します単一クエリの

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