SQL查询联接表
我正在尝试根据地址1的主键连接表。但是,以下问题会为同一地址003 78057911 wpphtp创建重复记录=F和003 78057922 wpphtp=F是数据库中相同的字段,但是我想在不同的列中提取它。我怎样才能做到SQL查询联接表,sql,sql-server,jdedwards,Sql,Sql Server,Jdedwards,我正在尝试根据地址1的主键连接表。但是,以下问题会为同一地址003 78057911 wpphtp创建重复记录=F和003 78057922 wpphtp=F是数据库中相同的字段,但是我想在不同的列中提取它。我怎样才能做到 select ABAN8,'CREATE',ABALPH, '','', '','','','','','', EAEMAL,'', CASE WHEN wpphtp != 'F'
select ABAN8,'CREATE',ABALPH, '','', '','','','','','', EAEMAL,'',
CASE
WHEN wpphtp != 'F'
THEN WPAR1
else ' '
END AS prefix ,'', CASE
WHEN wpphtp != 'F'
THEN WPph1
else ' '
END AS phone, '',CASE
WHEN wpphtp = 'F'
THEN wpar1
else ' '
END AS prefixfax,' ',CASE
WHEN wpphtp = 'F'
THEN wpph1
else ' '
END AS fax from PRODDTA.F0111
join PRODDTA.F01151 on proddta.f0111.wwan8 = PRODDTA.F01151.EAAN8
join PRODDTA.F0115 JOIN PRODDTA.F0101 ON PRODDTA.F0115.wpAN8 = PRODDTA.F0101.ABAN8
ON PRODDTA.F0115.wpAN8 = PRODDTA.F0111.wwAN8 where wwidln < 1
order by wwan8
预期结果:
1 CREATE | E-GLOBAL INNOVATIVE SDN BHD | kinki@hostpro2u.com | 003 | 78057911 | 003 | 78057922
1 CREATE | E-GLOBAL INNOVATIVE SDN BHD | billing@hostpro2u.com | 003 | 78057911 | 003 | 78057922
您可以使用条件聚合来获取不同列中不同wpphtp的值。如果看不到表结构和样本数据,很难100%确定,但这应该是可行的:
select ABAN8,'CREATE',ABALPH, '','', '','','','','','', EAEMAL,'',
MAX(CASE WHEN wpphtp != 'F' THEN WPAR1 END) AS prefix,'',
MAX(CASE WHEN wpphtp != 'F' THEN WPph1 END) AS phone, '',
MAX(CASE WHEN wpphtp = 'F' THEN wpar1 END) AS prefixfax,' ',
MAX(CASE WHEN wpphtp = 'F' THEN wpph1 END) AS fax
from PRODDTA.F0111
join PRODDTA.F01151 on proddta.f0111.wwan8 = PRODDTA.F01151.EAAN8
join PRODDTA.F0115 JOIN PRODDTA.F0101 ON PRODDTA.F0115.wpAN8 = PRODDTA.F0101.ABAN8
ON PRODDTA.F0115.wpAN8 = PRODDTA.F0111.wwAN8 where wwidln < 1
GROUP BY -- add all the other column names here
order by wwan8
在GROUP BY子句中,您需要添加所有其他列名,即除prefix、phone、prefixfax和fax之外的所有列名。如果没有看到数据,很难确切地告诉您原因,但是,首先要查看表中的重复数据来自何处。或者,您可以尝试使用DISTINCT,但这会掩盖问题。数据是返回的结果,我不能使用DISTINCT,因为地址号是1。它将只返回一个地址no.1和电子邮件:kinki@hostpro2u.comI根据结果的预期结果考虑,您需要在查询中使用pivot将最后一列的行转换为列。您可以使用reference:@Synetrix抱歉,我的意思是,没有看到所有表中的数据,DISTINCT应该查看整行,而不仅仅是某些条件查询使用选择列表中所有指定列中的值的组合来评估唯一性。这似乎是我需要的,我可以知道MAX and END的目的是什么吗statement@Synetrix所有大小写表达式都需要一个结尾;如果没有ELSE,那么当条件为非true时,CASE表达式的结果为NULL,MAX会忽略它。因此,基本上MAX和CASE with no ELSE子句的组合意味着,对于每个表达式,我们只会得到与条件匹配的值。请注意,由于我们只得到一个值,我们可以像使用最大值一样轻松地使用最小值。我希望这有助于。。。
select ABAN8,'CREATE',ABALPH, '','', '','','','','','', EAEMAL,'',
MAX(CASE WHEN wpphtp != 'F' THEN WPAR1 END) AS prefix,'',
MAX(CASE WHEN wpphtp != 'F' THEN WPph1 END) AS phone, '',
MAX(CASE WHEN wpphtp = 'F' THEN wpar1 END) AS prefixfax,' ',
MAX(CASE WHEN wpphtp = 'F' THEN wpph1 END) AS fax
from PRODDTA.F0111
join PRODDTA.F01151 on proddta.f0111.wwan8 = PRODDTA.F01151.EAAN8
join PRODDTA.F0115 JOIN PRODDTA.F0101 ON PRODDTA.F0115.wpAN8 = PRODDTA.F0101.ABAN8
ON PRODDTA.F0115.wpAN8 = PRODDTA.F0111.wwAN8 where wwidln < 1
GROUP BY -- add all the other column names here
order by wwan8