postgresql postgresSql枢轴:我想返回动态列

42fyovps  于 2022-12-26  发布在  PostgreSQL
关注(0)|答案(1)|浏览(138)

我在DB中存储的数据如下所示:
| 身份证|星期|数量|产品代码|相关ID|
| - ------|- ------|- ------|- ------|- ------|
| 1个|小行星2201|十个|X000001|二十四|
| 第二章|小行星2202|十四|X000001|二十四|
| 三个|小行星2201|十五|X000002|二十四|
| 四个|小行星2202|二十五|X000002|二十四|
| 五个|小行星2210|十一|X000001|二十五|
| 六个|二二四四|二十二|X000001|二十六|
| ...|||||
我想使用所选的related_id进行SQL查询,以获得以下结果:例如,如果我选择related_id = 24
| 产品代码|小行星2201|小行星2202|小行星2203| ...|
| - ------|- ------|- ------|- ------|- ------|
| X000001|十个|十四|...||
| X000002|十五|二十五|...||
我想将related_id的所有week值转换为按ASC顺序排列的列,并将正确的qty放在每个(product_code,week)对的前面。
谢啦,谢啦

brjng4g3

brjng4g31#

经过几天的SQL培训,我终于找到了一个解决方案,我把它贴在这里,它可能会帮助一些人,特别感谢@S-Man的激励:)

DO
    $$
    DECLARE
      sql text;
    BEGIN
      WITH latest_create_date AS (
        SELECT product_code, week, MAX(create_date) AS max_create_date
        FROM my_table_name
        WHERE related_id = 437
        GROUP BY product_code, week
      )
      SELECT string_agg(
        DISTINCT 'SUM(CASE WHEN rop.week = ' || CAST(rop.week AS text) ||
                 ' THEN rop.qty ELSE 0 END) AS ' || rop.week || '',
        ', '
      ) INTO sql
      FROM my_table_name rop
      INNER JOIN latest_create_date lcd
      ON rop.product_code = lcd.product_code AND rop.week = lcd.week AND rop.create_date = lcd.max_create_date;
    
      IF sql IS NOT NULL THEN
        sql := 'SELECT product_code, ' || sql ||
               ' FROM my_table_name WHERE related_id = 437 GROUP BY product_code';
    
        EXECUTE sql;
      END IF;
    END;
    $$ LANGUAGE plpgsql;

相关问题