0

我在 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子句来帮助我只提取带有“公司:”文本的描述符行。如果我输入一个AND,则该表根本不会填充,我认为是因为它希望数据位于同一行中,而我想要来自 2 行但不同列的数据。如果我使用 andOR语句,它会添加一个全新的行。

这是我的脚本:

    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 语句留在了那里,以显示我一直在玩什么。这是我能得到的最接近的。

如果需要更多信息,请告诉我。

4

3 回答 3

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

于 2013-10-28T19:24:47.030 回答
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
于 2013-10-28T19:25:51.630 回答
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;
于 2013-10-29T09:53:30.793 回答