Как заменить нули на нули в кросс-таблицах postgresql - PullRequest
14 голосов
/ 15 июня 2011

У меня есть таблица товаров с product_id и более 100 атрибутами.Product_id - это текст, тогда как столбцы атрибута целочисленные, т. Е. 1, если атрибут существует.При запуске кросс-таблицы Postgresql несовпадающие атрибуты возвращают нулевые значения.Как вместо этого заменить нули на нули.

SELECT ct.*
INTO ct3
FROM crosstab(
'SELECT account_number, attr_name, sub FROM products ORDER BY 1,2',
'SELECT DISTINCT attr_name FROM attr_names ORDER BY 1')
AS ct(
account_number text,
Attr1 integer,
Attr2 integer,
Attr3 integer,
Attr4 integer,
...
)

Замените этот результат:

account_number  Attr1   Attr2   Attr3   Attr4
1.00000001  1   null    null    null
1.00000002      null    null    1   null
1.00000003  null    null    1   null
1.00000004  1   null    null    null
1.00000005  1   null    null    null
1.00000006  null    null    null    1
1.00000007  1   null    null    null

следующим:

account_number  Attr1   Attr2   Attr3   Attr4
1.00000001  1   0   0   0
1.00000002  0   0   1   0
1.00000003  0   0   1   0
1.00000004  1   0   0   0
1.00000005  1   0   0   0
1.00000006  0   0   0   1
1.00000007  1   0   0   0

Обходной путь должен был бы сделатьвыберите account_number, coalesce (Attr1,0) ... на результат.Но печатать слияние для каждого из 100+ столбцов довольно просто.Есть ли способ справиться с этим с помощью кросс-таблицы?Спасибо

Ответы [ 2 ]

20 голосов
/ 15 июня 2011

Вы можете использовать coalesce:

select account_number,
       coalesce(Attr1, 0) as Attr1,
       coalesce(Attr2, 0) as Attr2,
       etc
0 голосов
/ 31 мая 2016

, если вы можете поместить эти атрибуты в таблицу, как

атр

Attr1

attr2

Attr3

...

тогда вы можете автоматически сгенерировать повторяющийся оператор объединения, как

SELECT 'coalesce("' || attr || '", 0) "'|| attr ||'",' from table; чтобы сохранить набор текста.

...