用PostgreSQL中的条件将列转换为行

2024-10-03 02:32:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个谷歌表格如下

enter image description here

我已经通过Python将这个GS导入我的PostgreSQL(11.5)。我所做的是在我的数据库中创建一个表,其中包含表中指定的所有列,将列名视为第二行中的值(超过60列,最多可以增加120列),并通过PY脚本将数据导入表中

所以我的第一个要求是:有没有更好的动态方式?

其次, 我必须将所有这些列转换成除“重要关键字”列以外的行,我要将行值(即“18.12.19”)转换为列名,所有其他行值应根据转换后的列名填充

预期结果:

 Category        18.12.19
    B- Komplex      9 (0)
    B12             1, 4, 5, 7, 8, 13, 15, 17 (0)
    Betain          1 (0)
    Calcium         1, 7 (0)
    Cholin          0 (0)
    Chromium        No search results
    D1              1, 3, 6, 8, 13, 21, 29(0)

那怎么做呢

我正在使用下面的查询:

SELECT 'SELECT *
FROM   crosstab(
       ''SELECT unnest(''' || quote_literal(array_agg(attname))
                           || '''::text[]) AS col
             , row_number() OVER ()
             , unnest(ARRAY[' || string_agg(quote_ident(attname)
                              || '::text', ',') || ']) AS val
        FROM   ' || attrelid::regclass || '
        ORDER  BY generate_series(1,' || count(*) || '), 2''
   ) t (col text, '
     || (SELECT string_agg('r'|| rn ||' text', ',')
         FROM (SELECT row_number() OVER () AS rn FROM sheet.shop_rank) t)
     || ')' AS sql
FROM   pg_attribute
WHERE  attrelid = 'sheet.shop_rank'::regclass
AND    attnum > 0
AND    NOT attisdropped
GROUP  BY attrelid;

上面的查询将生成一个动态查询,如果我们运行它,列将被转换,我得到的结果如下所示

我现在得到的结果:

col                    r1
B12                    1, 4, 5, 7, 8, 13, 15, 17 (0)
Betain                 1 (0)
B- Komplex             9 (0)
Calcium                1, 7 (0)
Cholin                 0 (0)
Important keyword      18.12.19

那么有没有一种动态的方法呢?或者有更好的解决方案吗?任何建议/解决方案都会大有帮助。


Tags: textfromas动态colselectaggb12