我try 从下表在Postgres中创建一个Pivot表

Product_info表

SQL

CREATE TABLE product_info (
    ID varchar(10),
    date VARCHAR(20) NOT NULL,
    product VARCHAR(20) NOT NULL,
    product_cost integer 
);

INSERT INTO 
product_info(ID, date, product, product_cost)
VALUES
  ('1', 'AUG-23','Laptop',100),
  ('1', 'AUG-23','Phone',80),
  ('1', 'AUG-23','Keypad',50),
  ('1', 'SEP-23','Laptop',200),
  ('1', 'SEP-23','Phone',100),
  ('1', 'SEP-23','Ipad',150),
  ('1', 'SEP-23','Keypad',80),
  ('2', 'AUG-23','Laptop',100),
  ('2', 'AUG-23','Phone',90),
  ('2', 'AUG-23','Keypad',70),
  ('2', 'SEP-23','Laptop',120),
  ('2', 'SEP-23','Phone',30),
  ('2', 'SEP-23','Ipad',80),
  ('2', 'SEP-23','Keypad',40);

Tried below PIVOT Query

  SELECT * FROM crosstab(
  'SELECT date, id,product, sum(product_cost)
   FROM product_info
   GROUP BY 1, 2,3
   ORDER BY 1, 2,3'
,
  'SELECT DISTINCT product FROM product_info ORDER BY 1'
) as cte(
  date text,
  id text, 
  "Ipad" numeric,
  "Keypad" numeric,
  "Laptop" numeric,
  "Phone" numeric
)

RETURNED RESULT

date id Ipad Keypad Laptop Phone
AUG-23 1 NULL 70 100 90
SEP-23 1 80 40 120 30

EXPECTED RESULT

id date Ipad Keypad Laptop Phone
1 AUG-23 NULL 50 100 80
2 AUG-23 NULL 70 100 90
1 SEP-23 150 80 200 100
2 SEP-23 80 40 120 30

返回的实际上是ID=‘2’的返回值 当两个ID都需要时

推荐答案

由于只能将OBE行与交叉表一起使用,因此可以这样做.

但更简单的是与第二个查询类似的普通聚合

SELECT split_part(id, '%', 1) as id,
  split_part(id, '%', 2) as date,
        "Ipad" ,
    "Laptop" ,
    "Phone" ,
    "Keypad" 
  FROM crosstab(
    'SELECT  CONCAT(id,''%'',date) as id, product, sum(cost)
     FROM product_info
     GROUP BY 1, 2
     ORDER BY 1, 2'
,
    'SELECT DISTINCT product FROM product_info ORDER BY 1'
) as cte(
    id text,
    "Ipad" numeric,
    "Laptop" numeric,
    "Phone" numeric,
    "Keypad" numeric
)
id date Ipad Laptop Phone Keypad
1 Aug-23 null 50 250 100
1 Sep-23 200 60 260 100
2 Aug-23 null 80 220 100
2 Sep-23 90 80 100 100
SELECT
  id,date,
  SUM(CASE WHEN product = 'Ipad' THEN cost END ) as "Ipad",
  SUM(CASE WHEN product = 'Laptop' THEN cost END ) as "Laptop",
  SUM(CASE WHEN product = 'Phone' THEN cost END ) as "Phone",
  SUM(CASE WHEN product = 'Keypad' THEN cost END ) as "Keypad"
FROM 
product_info
GROUP BY id,date
ORDER BY id,date
id date Ipad Laptop Phone Keypad
1 Aug-23 null 250 100 50
1 Sep-23 200 260 100 60
2 Aug-23 null 220 100 80
2 Sep-23 90 100 100 80

fiddle

Sql相关问答推荐

如何在PostgreSQL中同时为id s列表执行多个update语句?'

Group By子句返回太多行

重新组合已排序的日期范围

根据开始日期和结束日期的差异计算每天的计费

SQL:查询作为子查询或CTE写入的最大和数失败

改进的SQL子字符串提取

配置单元查询失败:无法识别';附近的输入;LEFT'';(select子句中的';';col'

我需要在 ASP.NET C# 中获取 2 个 SQL 查询结果的平均值

如何修复初学者 SQL INNER JOIN 查询错误

MySQL中的递归查询邻接表深度优先?

AdventureWorks 查询

在特定条件下使用 LAG,确定要采用什么 LAG 值?

复制SQL Server临时表

在where语句中使用CTE非常缓慢

在自引用表中使用分组和计数的SQL查询语句

查询以查找今天和昨天的数据之间的差异以及伪列

在 postgresql 中,我可以将其组合成一个查询吗?

SQL日期比较用例;月初至今的报告

CURRENT_ROW 窗口框架上的 SQL 滞后

Select 随机行,使得列子组的组合是唯一的