将1到2中的2个列值合并到新表中的新行 - SQL中

时间:2013-10-28 18:52:38

标签: sql database oracle one-to-many

我在oracle中有一个几乎完整的SQL脚本,但我最后一个问题仍然存在。

我有2个数据库表我正在访问数据,并将新行插入到我的数据库中的新表中。 其中一个数据库表具有帐号列和描述符列,每个帐号都有3个描述符值,所有描述符都具有相同的格式。还有第三列,我想从中获取数据。这是一个视觉:

Account # | Descriptor           | Value
1           Cost Center: ASDF      CC123
1           Company: ASDF123       F123
1           Fund: JKL              R123
2           Cost Center: ASDF12    CC456
2           Company: ASDF456       F456
2           Fund: JKL23            R456

我希望我的决赛桌像这样:

Account_Number | Company_Description   |  Cost_Center_Value
1                Company: ASDF123         CC123
2                Company: ASDF456         CC456

Cost_Center_Value列和Company_Description列的元素来自不同的行,但是来自同一个帐户对象。

我遇到的问题是我有一个特殊的where子句来帮助我仅使用'Company:'文本提取描述符行。如果我输入AND,表格根本没有填充,我认为因为当我想要2行但不同列的数据时,它希望数据在同一行。如果我使用OR语句,则会添加一个完整的新行。

这是我的剧本:

    create table mydb.test1 as
select distinct substr(testdb.table1.FAO, 1) as Account_Number,
       'CM' || substr(testdb.table1.DESCRIPTOR, 18) as Division,
       substr(testdb.table1.value, 1) as Department,
       substr(testdb.table2.Workday_Description, 1) as Description,

  from testdb.table1
       join testdb.table2
           on testdb.table1.fao = testdb.table2.workday_number
           where testdb.table2.descriptor like 'Company for%'
           OR testdb.table1.value like 'CC%'
           order by Account_Number Desc

我把OR语句放在那里,以显示我一直在玩的东西。 这是我能得到的最接近的。

如果需要更多信息,请与我们联系。

3 个答案:

答案 0 :(得分:1)

真正的答案是了解正常形式并重新设计此数据库。但是你可以做一些可怕的事情,如:

Select
    Account_Number,
    max(Case 
        When Descriptor Like 'Company: %' then substr(Descriptor, 10, 1000) 
    end) Company_Description,
    max(Case 
        When Descriptor Like 'Cost Center: %' then value 
    end) Cost_Center_Value
From
    test -- this is the table in the example section
Group By
    Account_Number

<强> Example SQLFiddle

答案 1 :(得分:1)

您可以创建子查询,该子查询仅选择每个帐户的帐号和成本中心值,然后进行查询。

这不完美,但它可能会让你知道我在想什么:

    create table mydb.test1 as
select distinct substr(testdb.table1.FAO, 1) as Account_Number,
       'CM' || substr(testdb.table1.DESCRIPTOR, 18) as Division,
       substr(testdb.table1.value, 1) as Department,
       substr(testdb.table2.Workday_Description, 1) as Description,

  from testdb.table1
       join (
       select [ACCOUNT], [COST_CENTER_VALUE] 
       from [TABLE] 
       where Descriptor LIKE 'Cost Center%') a
       on a.account_number = table1.account_number

答案 2 :(得分:1)

尝试此查询:

create table mydb.test1 as
select distinct
account as Account_Number,
(select (case when t2.Description like 'Company%' then t2.description end) from testdb.table1 t2 where t1.account=t2.account and 
case when t2.Description like 'Company%' then t2.description end is not null)as Company_Description ,
(select (case when t2.Description like 'Cost Center%' then t2.value end) from testdb.table1 t2 where t1.account=t2.account and 
case when t2.Description like 'Cost Center%' then t2.value end is not null)as Cost_Center_Value
from testdb.table1 t1;