将日期列转置为行(PostgreSQL)

时间:2019-11-21 16:52:37

标签: sql postgresql transpose

我的桌子看起来像这样:

    ID    brand    version   stock   date

    1     AA         AAA      50     2019-11-11
    1     AA         AAA      52     2019-11-12
    1     AA         AAA      49     2019-11-13
    ...

    2     BB         BBB      30     2019-11-11
    2     BB         BBB      31     2019-11-12 
    2     BB         BBB      31     2019-11-13
   ...

基本上,日期列是动态的,因为我使用以下方法提取了从现在开始的最近14天:

  select id, brand, version, stock, date, DATEADD(DAY, -8, getdate()) as date_add
  from myTable 
  where date > date_add

意味着日期之后一周将不同于现在,所以我的问题是如何转置此动态表?因为我只知道使用“ case..when”的技巧,但是在这种情况下它不起作用。

我想要的输出将是:

ID    brand    version   2019-11-11  2019-11-12  2019-11-13

1     AA         AAA         50         52          49           ...    
2     BB         BBB         30         31          31           ...

我已经搜索了类似的问题,但是只有将SQL Server用于动态转置方式的答案。

我该如何处理?谢谢!

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

您可以使用以下代码:

SET @sql = NULL;
SELECT
    GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(CASE WHEN action = "',
      action,'"  AND ', 
           (CASE WHEN pagecount IS NOT NULL 
           THEN CONCAT("pagecount = ",pagecount) 
           ELSE pagecount IS NULL END),
      ' THEN 1 ELSE 0 end) AS ',
      action, IFNULL(pagecount,'')

    )
  )
INTO @sql
FROM
  t;

SET @sql = CONCAT('SELECT company_name, ', @sql, ' 
                  FROM t 
                   GROUP BY company_name');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

它来自同一链接,并且不使用in命令。它构建了一个动态字符串,其中包含来自透视列的数据