यह वही करेगा जो आपको चाहिए (डेमो )
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
यह एक बार में कॉलम के मानों को एक पंक्ति से हटा देता है।
उदाहरण के लिए 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)
अभिव्यक्ति सुनिश्चित करती है कि पहले गैर शून्य से सभी मान to_preserve
. हों 1
. पर सेट करें .
फिर यह to_preserve
. के साथ मानों का चयन करता है ध्वजांकित करें और ROW_NUMBER
. का उपयोग करें एक मान प्रदान करने के लिए जिसका उपयोग सही नए कॉलम में पिवोट करने के लिए किया जा सकता है।