【问题标题】:Need two rows data into one row using SQL需要使用 SQL 将两行数据合并为一行
【发布时间】:2019-09-05 17:35:43
【问题描述】:

我在 asg 表中有两列,根据分配类型将有两个分配编号。 即如果assignment type= WT,则分配编号将为WT1,当其为“W”时,编号将为W1

表格如下:

  ASG_NUMBER     ASG_TYPE person_id   JOB_CODE       ORG_CODE...........
    W1              W        12       TECHNINICAN    LOC_org
    WT1             WT       12        -             -

现在,我必须创建一个查询,在一行中获取工作项编号和分配编号。我做了一个查询,它正在获取两个不同的行。 我想要下面的专栏:

W_aSG_NUMBER     WT_ASG_NUMBER    JOB_CODE   ORG_CODE .... 

JOB_CODE 和 org_code 以及所有内容都应仅根据 W 行。

我在查询中使用了联合,但它为这一行提供了两行:

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')

【问题讨论】:

标签: sql oracle union


【解决方案1】:

您可以使用以下查询实现此目的:

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 

SELECT MAX(CASE WHEN A1.ASG_TYPE = 'W' THEN A1.ASG_NUMBER END) AS ASG_NUMBER,
MAX(CASE WHEN A1.ASG_TYPE = 'WT' THEN A1.ASG_NUMBER END) AS WT_NUMBER,
MAX(A1.JOB_CODE),
MAX(A1.ORG_CODE)
FROM ASG_TABLE A1
WHERE A1.PERSON_ID = <YOUR_PERSON_ID>
AND A1.ASG_TYPE IN ('W','WT')
GROUP BY
A1.EFFECTIVE_START_DATE, 
A1.EFFECTIVE_SEQUENCE

我知道这些专栏是因为我参与过这些专栏。 :)

干杯!!

【讨论】:

  • 这只有在我只有这些列可以获取时才有效。我必须获取 org_code、job_code 等等。
  • 否则将返回两行
  • 你应该先查询。
【解决方案2】:

您想显示 W 行及其 WT asg_number。你说,我们可以通过比较它们的asg_id找到属于W行的WT行。

一种方法是在子查询中选择 WT.asg_number:

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;

【讨论】:

    【解决方案3】:

    这里使用的是保持密集等级 这是小提琴。 http://sqlfiddle.com/#!4/f67d6/32

        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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多