首页 > 解决方案 > SQL SNOWFLAKE 中的 PIVOT 函数

问题描述

我有这个查询:

      SELECT *
  FROM TABLE_A
    PIVOT(MIN(DATETIME) FOR TATUS IN ('claim', 'bought', 'returned')) 
     AS P (NUMBER_ID, COUNTRY)

我在 TABLE_A 中有 10 列,当我在 P 之后添加 PRIMARY KEY 时,因此:P (NUMBER_ID, COUNTRY) - 这不是在表中找到的前两列,它弄乱了表的整个顺序并将它们作为前两列具有不同列的值。

有谁知道如何解决这个问题?或者如何让 'claim'、'bought' 和 'return' 列不显示引用而无需在 PK 中添加它们?

标签: sqlsnowflake-cloud-data-platform

解决方案


让我看看能不能重现你的问题。

分期数据:

create or replace temp table source as 
select $1 id, $2 status, $3::date date, $4 rand, $5 country
from values(1, 'claimed', '2020-01-01'::date, 1.1, 'us'), (1, 'bought', '2020-01-02', 1.2, 'us'), (1, 'reverted', '2020-01-03', 1.3, 'us')
, (2, 'claimed', '2020-01-01', 1.4, 'cl'), (2, 'bought', '2020-01-02', 1.5, 'cl'), (2, 'reverted', '2020-01-03', 1.6, 'cl');
;

旋转:

SELECT *
FROM source
PIVOT(MIN(date) FOR status IN ('claimed', 'bought', 'reverted')) 
AS P(id, country)

在此处输入图像描述

确实,这看起来不太好。

要修复它,请使用仅选择要在数据透视表中使用的列的子选择:

SELECT *
FROM (select id, country, status, date from source)
PIVOT(MIN(date) FOR status IN ('claimed', 'bought', 'reverted')) 
AS P(id, country, claimed, bought, reverted)

在此处输入图像描述

请向我们展示您的样本数据和所需的结果以获得进一步的帮助。


推荐阅读