2016-06-29 9 views
5

हवाला के ऊपर और नीचे एक प्रवेश मूल्यों से पॉप्युलेट करना मैं एक मेज जो लगता है कि: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); 

मैं:

enter image description here

यह नीचे दिए गए कोड से निर्मित किया जा सकता है EMPNO कॉलम को पॉप्युलेट करने की आवश्यकता है।

जब 3 कॉलम समान होते हैं: वर्कनो, रिलीज, उत्पाद, मैं एक व्यक्तिगत समूह से निपट रहा हूं और मेरा डेटासेट इन समूहों से बना है।

इस समूह के भीतर, यदि कोई ईएमपीएनओ शून्य है तो सबसे पहले इसे अगले ईएमपीएनओ द्वारा पॉप्युलेट किया जाना चाहिए जो शून्य नहीं है (यह कई प्रविष्टियां नीचे हो सकती हैं)। अगला ईएमपीएनओ नीचे OPSEQ संख्या द्वारा निर्धारित किया जाता है। यदि कोई ईएमपीएनओ नहीं है जो समूह में शून्य नहीं है (जैसे अंत में दो शून्य प्रविष्टियां), तो उसे इसके ऊपर के अंतिम ईएमपीएनओ द्वारा पॉप्युलेट किया जाना चाहिए जो शून्य नहीं है। मेरी अंत पर कोड प्रयास की कमी के लिए

enter image description here

क्षमा याचना:

तालिका तरह दिखना चाहिए। मुझे यकीन नहीं है कि इस से कहां से शुरू किया जाए। किसी भी पॉइंटर्स की बहुत सराहना की जाएगी।

+0

एसक्यूएल-सर्वर का संस्करण क्या है? – mxix

+0

एसक्यूएल सर्वर 2012 –

+0

आपके पास OPSEQ 50 को 698 के रूप में कोड किया गया है लेकिन आपकी आवश्यकताओं के मुताबिक इसे 345 पर सेट किया जाएगा। आपको अपनी आवश्यकताओं को थोड़ा सा ठीक करने की आवश्यकता है। यदि आप उस विवरण को पूरा कर सकते हैं तो इसे पूरा करना आसान होना चाहिए। –

उत्तर

4

इसे हल करने के कई तरीके हैं। एक आवेदन के साथ है।

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

@ कॉलिनो'ब्रायन क्षमा करें याद किया गया है =) बस इसे शामिल करने वाली कुंजी के रूप में जोड़ें .. संपादित करें। – mxix

1

नीचे कोड उपयोगी हो सकता है।

पहले अद्यतन अगले नहीं अशक्त 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