Sql 复杂查询集成
这是我正在处理的主要问题,它即将完成。我最不需要添加的是客户的最后10个电话号码Sql 复杂查询集成,sql,sql-server,tsql,Sql,Sql Server,Tsql,这是我正在处理的主要问题,它即将完成。我最不需要添加的是客户的最后10个电话号码 select distinct max(case when isnull(d.lastname,'')='' then d.name else d.firstname+' '+(case when isnull(d.middlename,'')='' then '' else d.middlename+' ' end)+d.lastname+
select distinct
max(case when isnull(d.lastname,'')='' then d.name
else d.firstname+' '+(case when isnull(d.middlename,'')='' then '' else d.middlename+' ' end)+d.lastname+
(case when isnull(d.suffix,'')='' then '' else ' '+d.suffix end) end)
,max(isnull(d.street1,p.street1))
,max(isnull(d.street2,''))
,max(d.city)
,max(isnull(d.state,p.state))
,max(isnull(d.zipcode,p.zipcode))
,max(dbo.stripnondigits(isnull(d.ssn,p.ssn)))
,'Add'
,'Primary Secondary Flag'
,max(m.number)
, as 'phone1'
, as 'phone2'
, as 'phone3'
, as 'phone4'
, as 'phone5'
, as 'phone6'
, as 'phone7'
, as 'phone8'
, as 'phone9'
, as 'phone10'
from people p
inner join master m
on p.accountid = m.number
inner join d_table d on p.debtorid=d.debtorid and isnull(d.jobname,'')=''
group by p.pid
我需要phone*列填充最新的电话号码phone1到下一个最新的电话号码phone2,依此类推
以下是获取最后10个电话号码的查询:
select ah.rownumber, ah.number, ah.dateadded, ah.phonenumber
from (SELECT ROW_NUMBER() OVER (partition by number order by dateadded desc) as 'rowNumber', number, dateadded, phonenumber
FROM phones_master) ah
where rownumber <=10
order by ah.number, ah.rownumber
此查询将为一个人返回最多1到10个电话号码
它按ah.number=m.number分组
我不知道如何将这两个查询合并为一个查询。有些帐户将返回1个电话号码,有些帐户可能返回10个。甚至可以集成这两个查询吗?第一个是很久以前另一个人写的,我只需要在其中构建第二个查询。我认为这里可能存在不必要的嵌套级别,但这应该可以:
Select
name,
street1,
street2,
city,
state,
zipcode,
ssn,
action,
flag,
[number],
[1] phone1,
[2] phone2,
[3] phone3,
[4] phone4,
[5] phone5,
[6] phone6,
[7] phone7,
[8] phone8,
[9] phone9,
[10] phone10
From (
select
[name],
street1,
street2,
city,
state,
zipcode,
ssn,
action,
flag,
p.[number],
t.rn,
t.phonenumber
from (
select
max(case when
isnull(d.lastname, '') = '' then d.name
else d.firstname + ' ' + (
case when
isnull(d.middlename, '') = '' then ''
else d.middlename + ' '
end) + d.lastname + (
case when
isnull(d.suffix, '') = '' then ''
else ' ' + d.suffix
end)
end) [name],
max(isnull(d.street1, p.street1)) street1,
max(isnull(d.street2,'')) street2,
max(d.city) city,
max(isnull(d.state,p.state)) state,
max(isnull(d.zipcode,p.zipcode)) zipcode,
max(dbo.stripnondigits(isnull(d.ssn,p.ssn))) ssn,
'Add' action,
'Primary Secondary Flag' flag,
max(m.number) [number]
from
people p
inner join
master m
on p.accountid = m.[number]
inner join
d_table d
on p.debtorid = d.debtorid
where
isnull(d.jobname, '') = ''
group by
p.pid
) p
left outer join (
select
ah.[number],
ah.rn,
ah.phonenumber
from (
select
[number],
row_number() over (partition by [number] order by dateadded desc) rn,
phonenumber
from
phones_master
) ah
where
rn <= 10
) t
on p.[number] = t.[number]
) x
pivot (
max(phonenumber)
for
rn in ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10])
) as piv
这是一个旧版本的兼容性级别
Select
name,
street1,
street2,
city,
state,
zipcode,
ssn,
action,
flag,
[number],
max(case rn when 1 then phonenumber end) phone1,
max(case rn when 2 then phonenumber end) phone2,
max(case rn when 3 then phonenumber end) phone3,
max(case rn when 4 then phonenumber end) phone4,
max(case rn when 5 then phonenumber end) phone5,
max(case rn when 6 then phonenumber end) phone6,
max(case rn when 7 then phonenumber end) phone7,
max(case rn when 8 then phonenumber end) phone8,
max(case rn when 9 then phonenumber end) phone9,
max(case rn when 10 then phonenumber end) phone10
From (
select
[name],
street1,
street2,
city,
state,
zipcode,
ssn,
action,
flag,
p.[number],
t.rn,
t.phonenumber
from (
select
max(case when
isnull(d.lastname, '') = '' then d.name
else d.firstname + ' ' + (
case when
isnull(d.middlename, '') = '' then ''
else d.middlename + ' '
end) + d.lastname + (
case when
isnull(d.suffix, '') = '' then ''
else ' ' + d.suffix
end)
end) [name],
max(isnull(d.street1, p.street1)) street1,
max(isnull(d.street2,'')) street2,
max(d.city) city,
max(isnull(d.state,p.state)) state,
max(isnull(d.zipcode,p.zipcode)) zipcode,
max(dbo.stripnondigits(isnull(d.ssn,p.ssn))) ssn,
'Add' action,
'Primary Secondary Flag' flag,
max(m.number) [number]
from
people p
inner join
master m
on p.accountid = m.[number]
inner join
d_table d
on p.debtorid = d.debtorid
where
isnull(d.jobname, '') = ''
group by
p.pid
) p
left outer join (
select
ah.[number],
ah.rn,
ah.phonenumber
from (
select
[number],
row_number() over (partition by [number] order by dateadded desc) rn,
phonenumber
from
phones_master
) ah
where
rn <= 10
) t
on p.[number] = t.[number]
) x
Group By
name,
street1,
street2,
city,
state,
zipcode,
ssn,
action,
flag,
[number]
如果两个查询中都有一个共同的id列,那么我认为您可以执行类似于第二个查询中yourIDColumn的位置的操作,也许?@Laurence它似乎不需要区分,因为它返回2165行,有或没有唯一帐户。p.pid上有一个group by,它一定没有被添加。@JamesWilson我也看不到任何别名为d的东西,但它在整个查询中都被引用。@Laurence这是我遗漏的一个表联接,我认为没有必要,我会编辑它。我有点困惑,为什么你要做maxcity或max state…你希望2个或3个城市与一个记录关联,以及maxcity如何正确填充它?Drats,我必须调整我的数据透视表兼容级别。让我看看网络人员是否能做到这一点。@JamesWilson请不要这样做如果这是一个实时系统,你可以手工编写,只是有点糟糕我不打算这么做。我刚检查过,老板说用临时表格手工写。很抱歉这么大惊小怪。@JamesWilson您不需要临时表,请参阅第二个查询。是的,现在查看它。获取错误:列“x.name”在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中。我正在努力解决的问题。