我在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语句放在那里,以显示我一直在玩的东西。 这是我能得到的最接近的。
如果需要更多信息,请与我们联系。
答案 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;