Транспонирование таблицы с превращением столбцов в значение строки - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть следующая таблица:

id      purch_d7   purch_d30     
 1         10             25
 2          5             15

, и я хочу переместить / повернуть ее в этот формат

 id     purchase_count   purch_window
  1           10         purch_d7
  1           25         purch_d30 
  2            5         purch_d7
  2           15         purch_d30

Как мне поступить в Vertica?Кроме того, если бы я хотел повернуть / транспонировать вывод обратно в исходное представление, как бы я это сделал?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Мне нравится, когда код показывает, что я пытаюсь сделать.Я поворачиваю именованные столбцы по вертикали в значение и «имя значения».Поэтому я добавляю имена значений в дополнительную таблицу, которую я поставляю.

Вот так:

WITH
-- don't add this first one to your query - it's just your data ...
input(id,purch_d07,purch_d30) AS (
          SELECT  1,10,25
UNION ALL SELECT  2, 5,15
)
,
-- real WITH clause starts here ...
-- add the possible purch types as an in-line table with labels
purch_window(purch_window) AS (
          SELECT 'purch_d07'
UNION ALL SELECT 'purch_d30'
)
SELECT 
  id
, CASE purch_window 
    WHEN 'purch_d07' THEN purch_d07
    WHEN 'purch_d30' THEN purch_d30
  ELSE NULL
  END AS purchase_count
, purch_window
FROM input CROSS JOIN purch_window
ORDER BY 1,3
;

Затем поворачиваем назад: ...

WITH
input(id,purch_d07,purch_d30) AS (
          SELECT  1,10,25
UNION ALL SELECT  2, 5,15
)
,
-- real WITH clause starts here ...
-- add the possible purch types as an in-line table with labels
purch_window(purch_window) AS (
          SELECT 'purch_d07'
UNION ALL SELECT 'purch_d30'
)
,
pivoted AS (
SELECT 
  id
, CASE purch_window 
    WHEN 'purch_d07' THEN purch_d07
    WHEN 'purch_d30' THEN purch_d30
  ELSE NULL
  END AS purchase_count
, purch_window
FROM input CROSS JOIN purch_window
)
SELECT
  id
, SUM(CASE purch_window WHEN 'purch_d07' THEN purchase_count END) AS purch_d07
, SUM(CASE purch_window WHEN 'purch_d30' THEN purchase_count END) AS purch_d30
FROM pivoted
GROUP BY 1
ORDER BY 1
;

Все, что у вас естьсделать это скопировать вставить в ваш клиент vsql (или любой другой клиент, который вы используете для подключения к Vertica ...)

0 голосов
/ 01 октября 2018

Вы можете попробовать использовать UNION ALL

SELECT id,purch_d7 as purchase_count,'purch_d7' as purch_window FROM T
UNION ALL 
SELECT id,purch_d30,'purch_d30' FROM T
...