Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要使用SQL将两行数据转换为一行_Sql_Oracle_Union - Fatal编程技术网

需要使用SQL将两行数据转换为一行

需要使用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 -

我在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        -             -
现在,我必须创建一个查询,在一行中获取工作项编号和分配编号。我做了一个查询,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;