2017-06-20 53 views
6

मैं बाईं ओर करने के लिए डेटा (कॉलम) शिफ्ट करने के लिए करता है, तो पहले कॉलम (बाईं ओर कॉलम) 0 मूल्य है और शून्य दाईं ओर स्तंभों में जोड़ा जाना चाहिए आवश्यकता होती है। किसी भी कॉलम में गैर-शून्य मान मिलने के बाद बाद में कॉलम में 0 मान शेष रहना चाहिए।एमएस एसक्यूएल 2012: बाईं ओर से एसक्यूएल शिफ्ट कॉलम में यदि स्तंभ 0

इनपुट डेटा: -

cust_id month1 month2 month3 month4 month5 
c1  100  200  300  400  500 
c2  0  0  50  250  350 
c3  0  0  100  0  0 
c4  100  0  100  0  500 
c5  0  0  0  0  0 

अपेक्षित आउटपुट परिणाम: -

cust_id month1 month2 month3 month4 month5 
c1  100  200  300  400  500 
c2  50  250  350  NULL NULL 
c3  100  0  0  NULL NULL 
c4  100  0  100  0  500 
c5  NULL NULL NULL NULL NULL 

एक स्थिर काम के आसपास हो सकता है:

IF month1=0 and month2=0 and month3=0 and month4=0 and month5=0 
THEN INSERT INTO TABLE output_table AS SELECT cust_id,'NULL','NULL','NULL','NULL','NULL' FROM input_table 

IF month1=0 and month2=0 and month3=0 and month4=0 and month5 != 0 
THEN INSERT INTO TABLE output_table AS SELECT cust_id,month5,'NULL','NULL','NULL','NULL' FROM input_table 

IF month1=0 and month2=0 and month3=0 and month4 != 0 and month5 != 0 
THEN INSERT INTO TABLE output_table AS SELECT cust_id,month4,month5,'NULL','NULL','NULL' FROM input_table 

IF month1=0 and month2=0 and month3 !=0 and month4 != 0 and month5 != 0 
THEN INSERT INTO TABLE output_table AS SELECT cust_id,month3,month4,month5,'NULL','NULL' FROM input_table 

IF month1 != 0 and month2 != 0 and month3 !=0 and month4 != 0 and month5 != 0 
THEN INSERT INTO TABLE output_table AS SELECT cust_id,month1,month2,month3,month4,month5,'NULL' FROM input_table 

मैं स्टैक ओवरफ़्लो पर नेतृत्व छोड़ दिया करने के लिए करता है, तो सभी स्तंभों अशक्त हैं कॉलम शिफ्ट करने के लिए बताते हैं कि नीचे मिल सकता है। लेकिन यह सभी एनयूएलएल को प्रतिस्थापित करता है (भले ही न्यूल किसी गैर-शून्य/शून्य मूल्य के बाद आ रहा हो)।

move cells left in sql if left contains null and right contains value

मैं एक गतिशील समाधान जब महीने दर महीने के डेटा जोड़ा जाता है कि नए कॉलम संभाल कर सकते हैं का निर्माण करने की योजना बना रहा हूँ।

डाटाबेस है: एमएस एसक्यूएल सर्वर 2012

त्वरित डेटा तैयार करने SQLs: -

CREATE TABLE input_table(
     cust_id char(5), 
     month1 int, 
     month2 int, 
     month3 int, 
     month4 int, 
     month5 int 
); 


INSERT INTO input_table VALUES 
('c1',100,200,300,400,500), 
('c2',0,0,50,250,350), 
('c3',0,0,100,0,0), 
('c4',100,0,100,0,500), 
('c5',0,0,0,0,0); 
+1

आप इस कार्रवाई के लिए विशेष रूप से एक प्रारंभिक चरण के रूप में अपने डेटा denormalized है? यदि आपका डेटा cust_id, month_number, और मान के लिए कॉलम के रूप में है, तो उनके साथ काम करना आसान होगा। यदि आधार डेटा आपके द्वारा दिखाए गए denormalized रूप में हैं, तो आप केवल इस ऑपरेशन के लिए उन्हें सामान्य कर सकते हैं। –

+0

इस प्रारूप में आपको प्राप्त करने के बाद डेटा के साथ आप क्या करने जा रहे हैं? और आप उन का उपयोग कर https://ozh.github.io/ascii-tables/ – scsimon

+0

@scsimon मैं/p स्वरूपित और उम्मीद ओ पठनीय प्रारूप में/p टेबल तालिकाओं का प्रारूप कृपया कर सकते हैं। एमएल अल्गो के लिए यह आवश्यक है। – XEngineer

उत्तर

1

यह तुम क्या जरूरत है (demo)

SELECT i.cust_id, 
     oa.* 
FROM input_table i 
     OUTER APPLY (SELECT pvt.* 
        FROM (SELECT month, 
            col = CONCAT('month', ROW_NUMBER() OVER (ORDER BY idx)) 
          FROM (SELECT month, 
              idx, 
              to_preserve = MAX(IIF(month=0,0,1)) OVER (ORDER BY idx) 
            FROM (VALUES (1, month1), 
                (2, month2), 
                (3, month3), 
                (4, month4), 
                (5, month5)) V(idx, month)) unpvt 
          WHERE to_preserve = 1) t 
          PIVOT (MAX(month) FOR col IN (month1, month2, month3, month4, month5)) pvt 
          ) oa 

यह unpivots करना चाहिए कॉलम एक समय में एक पंक्ति मानता है।

उदाहरण C3 के लिए ऊपर

+---------+-------+-----+-------------+ 
| cust_id | month | idx | to_preserve | 
+---------+-------+-----+-------------+ 
| c3  |  0 | 1 |   0 | 
| c3  |  0 | 2 |   0 | 
| c3  | 100 | 3 |   1 | 
| c3  |  0 | 4 |   1 | 
| c3  |  0 | 5 |   1 | 
+---------+-------+-----+-------------+ 

MAX(IIF(month=0,0,1)) OVER (ORDER BY idx) अभिव्यक्ति पहली गैर शून्य से एक से सभी मूल्यों सुनिश्चित करता है करने के लिए unpivoted अंत के बाद 1 को to_preserve सेट करना होगा।

तो यह to_preserve ध्वज के साथ मान का चयन करता है और ROW_NUMBER का उपयोग करता है सही नया स्तंभ में पिवट के लिए इस्तेमाल किया जा सकता एक मूल्य प्रदान करने के लिए।

संबंधित मुद्दे