Oracle SQL-将列转换为行分组
我在Oracle 11g实例上运行了以下SQL查询,效果非常好:Oracle SQL-将列转换为行分组,sql,oracle,oracle11g,grouping,transpose,Sql,Oracle,Oracle11g,Grouping,Transpose,我在Oracle 11g实例上运行了以下SQL查询,效果非常好: SELECT TRIM(PART_NM) || TRIM(PART_NO), TRIM(MKBY_IND), MFG_TYP FROM TblPARTS WHERE ORDER_START_DATE >= (SYSDATE - 365) AND TO_CHAR(TRIM(PART_NO)) != '99' 这将产生如下结果: | Part | Make / Buy
SELECT
TRIM(PART_NM) || TRIM(PART_NO),
TRIM(MKBY_IND),
MFG_TYP
FROM
TblPARTS
WHERE
ORDER_START_DATE >= (SYSDATE - 365)
AND
TO_CHAR(TRIM(PART_NO)) != '99'
这将产生如下结果:
| Part | Make / Buy | Area |
|:----:|:----------:|:---------:|
| AU54 | M | Demo |
| ZA45 | M | Construct |
| AD28 | B | Construct |
| SX73 | B | Construct |
| MO47 | M | Construct |
| IN66 | B | Construct |
| RP42 | M | Demo |
| HF77 | B | Demo |
| IE43 | B | Personal |
| OX11 | B | Personal |
| ZE45 | M | Demo |
| JH21 | M | Construct |
| AM91 | M | Construct |
| DS50 | M | Demo |
| LE29 | M | Demo |
| IP91 | M | Demo |
| ID42 | M | Demo |
| RI96 | M | Demo |
我在那里没有问题。但是,有人要求我转置Area列,而不是按它对行进行分组。类似于:
| Part | Make / Buy |
|:---------:|:----------:|
| CONSTRUCT | CONSTRUCT |
| AU54 | M |
| ZA45 | M |
| AD28 | B |
| SX73 | M |
| MO47 | M |
| IN66 | B |
| JH21 | M |
| AM91 | B |
| DEMO | DEMO |
| RP42 | M |
| HF77 | M |
| ZE45 | M |
| DS50 | B |
| LE29 | M |
| IP91 | M |
| ID42 | M |
| RI96 | M |
| PERSONAL | PERSONAL |
| IE43 | M |
| OX11 | M |
简言之,我希望在“区域”列(MFG_TYP
)字段中找到唯一的值,并能够按它们按行分组。应该注意的是,列出的三个条目在我的数据集中是有效的,但可能会发生更改,因此我不是在寻找静态解决方案,而是在区域
列中的所有唯一值上动态应用转换的方法
我曾尝试查看这些资源,但目前不了解如何构建解决方案。任何建议都将不胜感激
SELECT
'CONSTRUCT' AS "Part",
'CONSTRUCT' AS "Make / Buy"
FROM DUAL
UNION
SELECT
TRIM(PART_NM) || TRIM(PART_NO) AS "Part",
TRIM(MKBY_IND) AS "Make / Buy"
FROM
TblPARTS
WHERE
ORDER_START_DATE >= (SYSDATE - 365)
AND TO_CHAR(TRIM(PART_NO)) != '99'
AND MFG_TYP = 'Construct'
UNION
SELECT
'DEMO' AS "Part",
'DEMO' AS "Make / Buy"
FROM DUAL
UNION
SELECT
TRIM(PART_NM) || TRIM(PART_NO) AS "Part",
TRIM(MKBY_IND) AS "Make / Buy"
FROM
TblPARTS
WHERE
ORDER_START_DATE >= (SYSDATE - 365)
AND TO_CHAR(TRIM(PART_NO)) != '99'
AND MFG_TYP = 'Demo'
UNION
SELECT
'PERSONAL ' AS "Part",
'PERSONAL ' AS "Make / Buy"
FROM DUAL
UNION
SELECT
TRIM(PART_NM) || TRIM(PART_NO)) AS "Part",
TRIM(MKBY_IND) AS "Make / Buy"
FROM
TblPARTS
WHERE
ORDER_START_DATE >= (SYSDATE - 365)
AND TO_CHAR(TRIM(PART_NO)) != '99'
AND MFG_TYP = 'Personal'
快速解决方案包括:
在线测试。请提供您的样本数据,这将对您有所帮助。样本数据包含在帖子中。哪些内容需要编辑@AviI只看到您从查询中获得的结果和预期结果。是。这不符合样本数据的条件吗@阿维。我可以从表中选择*,但我不知道这会有多大好处。我很乐意为您提供您需要的帮助,但在过去,我也被告知使用我目前拥有的,然后使用我的预期结果。如果不仅仅是这三个
MFG_TYP
字段,这怎么可能起作用?也就是说,这个数字是动态的。我怎么可能对这三个变量进行静态调整,而不是对列中的所有唯一值进行静态调整?你能解释一下<7
,这是为什么吗?@JerryM.,7
是位向量111
的十进制表示形式,它对应于一个超集合行,其中区域
、部分
和购买
列的值为空
。看看
with
TblPARTS(Part, Make_Buy, Area) as (
select 'AU54', 'M', 'Demo' from dual union all
select 'ZA45', 'M', 'Construct' from dual union all
select 'AD28', 'B', 'Construct' from dual union all
select 'SX73', 'B', 'Construct' from dual union all
select 'MO47', 'M', 'Construct' from dual union all
select 'IN66', 'B', 'Construct' from dual union all
select 'RP42', 'M', 'Demo' from dual union all
select 'HF77', 'B', 'Demo' from dual union all
select 'IE43', 'B', 'Personal' from dual union all
select 'OX11', 'B', 'Personal' from dual union all
select 'ZE45', 'M', 'Demo' from dual union all
select 'JH21', 'M', 'Construct' from dual union all
select 'AM91', 'M', 'Construct' from dual union all
select 'DS50', 'M', 'Demo' from dual union all
select 'LE29', 'M', 'Demo' from dual union all
select 'IP91', 'M', 'Demo' from dual union all
select 'ID42', 'M', 'Demo' from dual union all
select 'RI96', 'M', 'Demo' from dual union all
select 'AO42', 'M', 'Public' from dual union all
select 'OA42', 'B', 'Public' from dual
),
a as (
select
Part, Make_Buy, Area,
GROUPING_ID(Area, Part, Make_Buy) gid
from TblPARTS
group by rollup(Area, (Part, Make_Buy))
having GROUPING_ID(Area, Part, Make_Buy) < 7
)
select
coalesce(Part, Area) Part,
coalesce(Make_Buy, Area) Make_Buy
from a
order by Area, gid desc
+------------+-----------+
| PART | MAKE_BUY |
+------------+-----------+
| Construct | Construct |
| AM91 | M |
| IN66 | B |
| JH21 | M |
| SX73 | B |
| ZA45 | M |
| AD28 | B |
| MO47 | M |
| Demo | Demo |
| ZE45 | M |
| RP42 | M |
| RI96 | M |
| LE29 | M |
| IP91 | M |
| ID42 | M |
| HF77 | B |
| AU54 | M |
| DS50 | M |
| Personal | Personal |
| OX11 | B |
| IE43 | B |
| Public | Public |
| OA42 | B |
| AO42 | M |
+------------+-----------+