首页 > 解决方案 > 重塑plsql中的数据

问题描述

我写了一个查询,它返回这样的结果:

在此处输入图像描述

但我应该像下面这样重塑结果: ![在此处输入图像描述

实际上,我想要的是跟踪特定 act_desc_ 的日期和 doc_no 和 qty,有人可以帮我在 PL SQL 中重写查询重塑吗?如果有人可以帮助我,我将不胜感激。

标签: plsqlpivot-tablereshape

解决方案


/* 可以使用许多复杂的查询,但这里有一个快速简单的方法,首先创建一个基表,然后再填充它。*/ --Step 1:使用正确数据类型的列创建空基表

CREATE TABLE BASE_TABLE AS 
(
 SELECT
  ACT_DESC_,

  QTY AS EXCAVATION_QTY,
  APP_DATE AS EXCAVATION_APP_DATE,
  DOC_NO AS EXCAVATION_DOC_NO,

  QTY AS FORM_WORK_COMP_QTY,
  APP_DATE AS FORM_WORK_COMP_APP_DATE,
  DOC_NO AS FORM_WORK_COMP_DOC_NO,

 FROM
  SOURCE_TABLE --this is the original table, or the table from the first image
 WHERE 0=1 --this clause condition is used to create an empty table
);

--步骤 2:将唯一的 ACT_DESC_ 值插入基表

INSERT INTO BASE_TABLE
(
 SELECT DISTINCT
  ACT_DESC_
 FROM
  SOURCE_TABLE
);  

--使用 Merge 语句 --Step 3:根据 TASK_ = 'Excavation' 更新基表

MERGE INTO BASE_TABLE TGT --Alias TGT short for TarGeT table
USING
 (
  SELECT * FROM SOURCE_TABLE
  WHERE TASK_ = 'Excavaion'
 ) SRC --Alias SRC short for SouRCe table
ON ( TGT.ACT_DESC_ = SRC.ACT_DESC_ )
WHEN MATCHED THEN UPDATE
SET 
  TGT.EXCAVATION_QTY = SRC.QTY
  TGT.EXCAVATION_APP_DATE = SRC.APP_DATE
  TGT.EXCAVATION_DOC_NO = SRC.DOC_NO;

--步骤 4:根据 TASK_ = 'Form Work Completion' 更新基表

MERGE INTO BASE_TABLE TGT --Alias TGT short for TarGeT table
USING
 (
  SELECT * FROM SOURCE_TABLE
  WHERE TASK_ = 'Form Work Completion'
 ) SRC --Alias SRC short for SouRCe table
ON ( TGT.ACT_DESC_ = SRC.ACT_DESC_ )
WHEN MATCHED THEN UPDATE
SET 
  TGT.FORM_WORK_COMP_QTY = SRC.QTY
  TGT.FORM_WORK_COMP_APP_DATE = SRC.APP_DATE
  TGT.FORM_WORK_COMP_DOC_NO = SRC.DOC_NO;

推荐阅读