需要使用SQL将两行数据转换为一行
我在asg表中有两列,根据作业类型有两个作业编号。 i、 e.如果需要使用SQL将两行数据转换为一行,sql,oracle,union,Sql,Oracle,Union,我在asg表中有两列,根据作业类型有两个作业编号。 i、 e.如果分配类型=WT,则分配编号将为WT1,当其“W”时,编号将为W1 下表如下: ASG_NUMBER ASG_TYPE person_id JOB_CODE ORG_CODE........... W1 W 12 TECHNINICAN LOC_org WT1 WT 12 -
分配类型=WT
,则分配编号将为WT1,当其“W”时,编号将为W1
下表如下:
ASG_NUMBER ASG_TYPE person_id JOB_CODE ORG_CODE...........
W1 W 12 TECHNINICAN LOC_org
WT1 WT 12 - -
现在,我必须创建一个查询,在一行中获取工作项编号和分配编号。我做了一个查询,hwich正在获取两个不同的行。
我想要下面的专栏:
W_aSG_NUMBER WT_ASG_NUMBER JOB_CODE ORG_CODE ....
工作代码和组织代码以及所有内容应仅符合W行
我在查询中使用了union,但它为这一行提供了两行:
select w_ASG_NUMBER,
wt_asg_number
ASG_TYPE,
JOB_CODE,
ORG_CODE
from
(select w_ASG_NUMBER,
'' wt_asg_number,
ASG_TYPE,
JOB_CODE,
ORG_CODE
from asg_table
where asg_type ='W'
UNION
select '' w_ASG_NUMBER,
wt_asg_number,
ASG_TYPE,
JOB_CODE,
ORG_CODE
from asg_table
where asg_type ='WT')
您可以使用以下查询来实现这一点:
SELECT A1.ASG_NUMBER AS ASG_NUMBER,
A2.ASG_NUMBER AS WT_NUMBER,
A1.JOB_CODE,
A1.ORG_CODE
FROM ASG_TABLE A1 JOIN ASG_TABLE A2
ON A1.PERSON_ID = A2.PERSON_ID
AND A1.EFFECTIVE_START_DATE = A2.EFFECTIVE_START_DATE
AND A1.ASG_TYPE || 'T' = A2.ASG_TYPE
AND A1.EFFECTIVE_SEQUENCE = A2.EFFECTIVE_SEQUENCE
或
选择MAX(当A1.ASG_类型='W'然后A1.ASG_编号结束时的情况)作为ASG_编号,
最大值(当A1.ASG_类型='WT'然后A1.ASG_编号结束时的情况)作为WT_编号,
最大值(A1.作业代码),
最大值(A1.ORG\u代码)
来自ASG_表A1
其中A1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1
和A1.ASG_输入('W','WT'))
分组
A1.生效开始日期,
A1.U有效序列
我之所以知道这些专栏,是因为我一直在写。:)
干杯 这里使用的是保持稠密秩 这是小提琴
您希望显示W行及其WT asg_编号。你说,我们可以通过比较它们的asg_id来找到属于W行的WT行 一种方法是在子查询中选择WT.asg_编号:
with w as (select * from mytable where asg_type = 'W')
, wt as (select * from mytable where asg_type = 'WT')
select w.*, (select asg_number from wt where wt.asg_id = w.asg_id) as wt_asg_number
from w;
这个表只有两行吗?如果不是,您如何知道哪些W行与哪些WT行对应?(即,是否有钥匙)asg_id是常见的@kfinity@Tejash是的,因为它是基于假设的,所以我添加了一个id,否则它的person_id只有在我只获取这些列的情况下,这才有效。。我必须获取组织代码、工作代码等等。这将返回两行,否则您应该使用第一个查询。
select asg_id,
MAX( asg_number) KEEP (DENSE_RANK LAST ORDER BY decode(ASG_TYPE,'W',1, 0)) W_asg_number,
MAX( asg_number) KEEP (DENSE_RANK LAST ORDER BY decode(ASG_TYPE,'WT',1, 0)) WT_asg_number,
MAX( JOB_CODE) KEEP (DENSE_RANK LAST ORDER BY decode(ASG_TYPE,'W',1, 0)) JOB_CODE,
MAX( ORG_CODE) KEEP (DENSE_RANK LAST ORDER BY decode(ASG_TYPE,'W',1, 0)) ORG_CODE
from mytable
group by asg_id
with w as (select * from mytable where asg_type = 'W')
, wt as (select * from mytable where asg_type = 'WT')
select w.*, (select asg_number from wt where wt.asg_id = w.asg_id) as wt_asg_number
from w;