如何将两张表的数据转换为扁平化视图并正确展示字段值
产品状态日期的扁平化查询实现
针对你提供的表结构,要将表B中的状态日期转换为独立列,生成扁平化视图,可以用以下两种常见方法实现:
通用CASE WHEN方法(支持多数关系型数据库)
这种方法兼容性强,适用于MySQL、PostgreSQL、SQL Server等几乎所有数据库:
SELECT a.ProdCode, MAX(CASE WHEN b.Status = 'Start' THEN b.Date END) AS `Start Date`, MAX(CASE WHEN b.Status = 'Done' THEN b.Date END) AS `Done Date` FROM 表A a INNER JOIN 表B b ON a.ProdCode = b.ProdCode GROUP BY a.ProdCode;
说明:
- 使用
INNER JOIN确保只返回表B中存在记录的产品(和你给出的期望视图完全匹配),如果需要包含表A中所有产品(即使表B无对应记录),将INNER JOIN改为LEFT JOIN即可 CASE WHEN根据状态匹配对应的日期,非目标状态的行返回NULLMAX()聚合函数用于排除NULL值,保证每个产品仅返回一行;如果同一产品同一状态有多条记录,MAX会取最晚的日期,根据需求也可替换为MIN取最早日期
专用PIVOT方法(以SQL Server为例)
部分数据库支持PIVOT语法,写法更简洁:
SELECT a.ProdCode, [Start] AS `Start Date`, [Done] AS `Done Date` FROM 表B PIVOT ( MAX(Date) FOR Status IN ([Start], [Done]) ) AS PivotTable INNER JOIN 表A a ON PivotTable.ProdCode = a.ProdCode;
说明:
- PIVOT语法直接将Status列的取值转为新列,聚合函数
MAX(Date)用于获取对应状态的日期 - 不同数据库的PIVOT语法有差异,比如MySQL无原生PIVOT,Oracle需要调整语法细节
内容的提问来源于stack exchange,提问作者woodlab
相关产品推荐
相关产品推荐

