【问题标题】:reshape data in plsql [closed]重塑plsql中的数据[关闭]
【发布时间】:2020-08-17 11:01:58
【问题描述】:

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

但我应该像下面这样重塑结果:

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

【问题讨论】:

  • 具体是 PL/SQL,还是只是一个查询?
  • SQL也很相似,SQL或者PLSQL都可以
  • PL/SQL 是一种编程语言。我想您可能指的是 Oracle SQL,它是一种查询语言。
  • 查询一下就可以了
  • 请在代码块、SQL 中提供表定义和示例数据作为 ascii,并解释您要应用的逻辑。请参阅Why should I provide a Minimal Reproducible Example for a very simple SQL query?。这篇文章还有一个链接,指向一个将表创建为 ascii 的工具。任何act_desc只能有两个不同的任务吗?

标签: plsql pivot-table reshape


【解决方案1】:

既然你已经发布了一张图片,我会给你一个例子,说明你如何使用一些快速的模拟数据和 SQL 来做到这一点:

select ACT_DESC, MAX(EXCAVATION_QTY) as EXCAVATION_QTY, MAX(FORM_WORK_COMPLETION_QTY) as FORM_WORK_COMPLETION_QTY
from (
    select QTY, ACT_DESC, TASK, 
        CASE WHEN TASK = 'EXCAVATION' THEN QTY ELSE NULL END as EXCAVATION_QTY,
        CASE WHEN TASK = 'Form Work Completion' THEN QTY ELSE NULL END as FORM_WORK_COMPLETION_QTY
    FROM
    (
    select 1 as QTY, 'a' as ACT_DESC, 'Excavation' as TASK
    UNION ALL
    select 2 as QTY, 'a' as ACT_DESC, 'Form Work Completion' as TASK
    UNION ALL
    select 11 as QTY, 'b' as ACT_DESC, 'Excavation' as TASK
    UNION ALL
    select 22 as QTY, 'b' as ACT_DESC, 'Form Work Completion' as TASK
    ) as t
) t1
GROUP BY ACT_DESC

需要:

并将其转换为:

【讨论】:

  • 效果很好,非常感谢。
【解决方案2】:

/* 可以使用许多复杂的查询,但这里有一个快速的 和简单的方法,首先创建一个基表,然后填充它。 */ --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
);  

--使用合并语句 --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;

--第四步:根据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;

【讨论】:

  • 感谢您的回答,但我无法在数据库中创建新表
猜你喜欢
  • 1970-01-01
  • 2016-03-20
  • 2021-01-31
  • 2017-11-26
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
相关资源
最近更新 更多