在 plsql 中重塑数据
reshape data in plsql
我写了一个查询,returns 结果如下:
但我应该像下面这样重塑结果:
事实上,我想要的是跟踪日期和 doc_no 以及特定 act_desc_ 的数量,有人可以帮我在 PL SQL 中重写查询重塑吗?如果有人能帮助我,我将不胜感激。
既然你已经发布了一张图片,我会给你一个例子,说明你如何使用一些快速模拟数据来做到这一点,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
需要:
并将其转换为:
/*
可以使用许多复杂的查询,但这里有一个快速的
和简单的方法,首先创建一个基础 table,然后填充它。
*/
--第 1 步:使用正确数据类型
的列创建空基数 table
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_ 值
插入基数 table
INSERT INTO BASE_TABLE
(
SELECT DISTINCT
ACT_DESC_
FROM
SOURCE_TABLE
);
--使用合并语句
--第三步:根据TASK_='Excavation'
更新basetable
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'
更新基table
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;
我写了一个查询,returns 结果如下:
但我应该像下面这样重塑结果:
事实上,我想要的是跟踪日期和 doc_no 以及特定 act_desc_ 的数量,有人可以帮我在 PL SQL 中重写查询重塑吗?如果有人能帮助我,我将不胜感激。
既然你已经发布了一张图片,我会给你一个例子,说明你如何使用一些快速模拟数据来做到这一点,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
需要:
并将其转换为:
/* 可以使用许多复杂的查询,但这里有一个快速的 和简单的方法,首先创建一个基础 table,然后填充它。 */ --第 1 步:使用正确数据类型
的列创建空基数 tableCREATE 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_ 值
插入基数 tableINSERT INTO BASE_TABLE
(
SELECT DISTINCT
ACT_DESC_
FROM
SOURCE_TABLE
);
--使用合并语句 --第三步:根据TASK_='Excavation'
更新basetableMERGE 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'
更新基tableMERGE 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;