sql - कम पंक्तियों के साथ एक पंक्ति को कई पंक्तियों में कनवर्ट करें




postgresql unpivot (2)

मैं PostgreSQL में एकल पंक्तियों में एकाधिक पंक्तियों में परिवर्तित करना चाहता हूं, जहां कुछ कॉलम निकाल दिए जाते हैं वर्तमान आउटपुट का एक उदाहरण यहां दिया गया है:

name | st | ot | dt |
-----|----|----|----|
Fred | 8  | 2  | 3  |
Jane | 8  | 1  | 0  |
Samm | 8  | 0  | 6  |  
Alex | 8  | 0  | 0  |  

निम्नलिखित क्वेरी का उपयोग करना:

SELECT
   name, st, ot, dt
FROM
   times;

और यहां मैं क्या चाहता हूं:

name |  t | val |
-----|----|-----|
Fred | st |  8  |
Fred | ot |  2  |
Fred | dt |  3  |
Jane | st |  8  |
Jane | ot |  1  |
Samm | st |  8  |
Samm | dt |  6  |
Alex | st |  8  |

उपरोक्त वांछित आउटपुट पाने के लिए मैं क्वेरी को कैसे संशोधित कर सकता हूं?


एक रास्ता:

with times(name , st , ot , dt) as(
select 'Fred',8  , 2  , 3  union all
select 'Jane',8  , 1  , 0  union all
select 'Samm',8  , 0  , 6  union all
select 'Alex',8  , 0  , 0  
)

select name, key as t, value::int  from 
(
    select name, json_build_object('st' ,st , 'ot',ot, 'dt',dt) as j
    from times
) t
join lateral json_each_text(j)
on true
where value <> '0'
-- order by name, case when key = 'st' then 0 when key = 'ot' then 1 when key = 'dt' then 2 end

SELECT
  times.name, x.t, x.val
FROM
  times cross join lateral (values('st',st),('ot',ot),('dt',dt)) as x(t,val)
WHERE
  x.val <> 0;




lateral