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。
我是 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。