CrossTab 函数 postgresql

CrossTab function posgresql

我是 postgresql 的新手,甚至是交叉表的新手,但根据我的阅读,以下查询应该有效:

select * from crosstab(
$$select distinct "AccountNumber" , "ProductCategory", sum("ProductQuantity") sm
from "MsfDataRecords" mdr
group by "ProductCategory", "AccountNumber", "ProductQuantity"$$
)as ct("AccountNumber" text , "ProductCategory" text , sm numeric)

但是这个错误 SQL Error [42601]: ERROR: return and sql tuple descriptions are incompatible

我检查了所有的数据类型,它们都是正确的。不过我不确定这是否与 sum 函数有关。

感谢任何帮助

错误在最后一行。 ct 中表示的列在此行中被选中。而不是

)as ct("AccountNumber" text , "ProductCategory" text , sm numeric)

应该是

as ct(
    AccountNumber text, 
    ProductCategory1 numeric, 
    ProductCategory2 numeric, 
    ProductCategory3 numeric, 
    ..., 
    ProductCategoryN numeric)

您的 GROUP BY 子句还应仅包含稍后排序的第一列和第二列。

这里有一个 dbfiddle 示例来说明。或者,如果您更喜欢这里的代码,请查看示例代码。

CREATE TABLE MsfDataRecords(
    AccountNumber text,
    ProductCategory text,
    ProductQuantity numeric
)
;

INSERT INTO MsfDataRecords(AccountNumber, ProductCategory, ProductQuantity) VALUES
    ('A1', 'Food', 3),
    ('A1', 'Food', 1),
    ('A2', 'Food', 3),
    ('A2', 'Electronics', 2),
    ('A2', 'Fashion', 10)
;

SELECT * FROM CROSSTAB(
    $$
    SELECT AccountNumber , ProductCategory, SUM(ProductQuantity) AS sm
    FROM MsfDataRecords AS mdr
    GROUP BY 1,2
    ORDER BY 1,2
    $$
)AS ct(
    AccountNumber text,
    Food numeric,
    Electronics numeric,
    Fashion numeric
)
;

请注意,像这样的旋转仅适用于 PostgreSQL