首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

数据库记要查找难题。

2013-11-02 
数据库记录查找难题。急急急急在一个表中进行数据查找匹配。表结构如下: 流水号客户名称数量商业名称1A1100B

数据库记录查找难题。急急急急
在一个表中进行数据查找匹配。表结构如下:
 流水号  客户名称  数量     商业名称
   1      A1     100       B1
   2      B1      50       B3
   3      B1      40       B2
   4      B3      60       B5
   5      B2     100       B6
   6      B5     100       B7

最终要得到
A1     50    B7
A1     40    B6   数据库,记录,匹配
[解决办法]
规则是什么?看不懂
[解决办法]
怎么弄出来的啊?
[解决办法]
应该是嵌套递归查找,找出客户的商业名称,又以商业名称为客户再找它下级一商业名称
[解决办法]

create table t
(
流水号 int, 客户名称  varchar(10),数量 int, 商业名称 varchar(10)
)
 

insert into t 
select   1,      'A1' ,    100,      'B1'
union all select   2,      'B1' ,    50 ,      'B3'
union all select   3,      'B1' ,    40 ,      'B2'
union all select   4,      'B3' ,    60 ,      'B5'
union all select   5,      'B2' ,    100,      'B6'
union all select   6,      'B5' ,    100,      'B7'


;with tt
as
(
select t.客户名称,
       isnull(tt.数量,t.数量) 数量,
       tt.商业名称,
       row_number() over(order by getdate()) as rownum,
       1 as level
from t
left join t tt
       on tt.客户名称 = t.商业名称
where  t.客户名称 = 'A1'

union all

select t1.客户名称,
       t1.数量,       
       t2.商业名称,
       t1.rownum,
       level + 1 as level
from tt t1
inner join t t2
        on t1.商业名称 = t2.客户名称
)

select 客户名称,数量,商业名称
from tt t1
where level= (select max(level) from tt t2 where t1.rownum = t2.rownum)
/*
客户名称数量商业名称
A140B6
A150B7
*/

[解决办法]
try this,

create table cz
(流水号 int,客户名称 varchar(10),数量 int,商业名称 varchar(10))

insert into cz
 select 1, 'A1', 100, 'B1' union all
 select 2, 'B1', 50, 'B3' union all
 select 3, 'B1', 40, 'B2' union all
 select 4, 'B3', 60, 'B5' union all
 select 5, 'B2', 100, 'B6' union all
 select 6, 'B5', 100, 'B7'


with t as
(select 客户名称,商业名称,数量,流水号,1 'lv' from cz a 
   where not exists(select 1 from cz b where b.客户名称=a.商业名称)
 union all
 select a.客户名称,a.商业名称,a.数量,b.流水号,b.lv+1 'lv'
  from cz a
  inner join t b on a.商业名称=b.客户名称
)
select b.客户名称,b.数量,a.商业名称
 from cz a
 inner join
 (select c.流水号,
         (select d.客户名称 from t d 
          where d.流水号=c.流水号 and d.lv=max(c.lv)) '客户名称',
         (select d.数量 from t d 


          where d.流水号=c.流水号 and d.lv=max(c.lv)-1) '数量'
  from t c
  group by c.流水号) b on a.流水号=b.流水号

/*
客户名称       数量          商业名称
---------- ----------- ----------
A1         40          B6
A1         50          B7

(2 row(s) affected)
*/


[解决办法]

[解决办法]
with test (id,nam1,qty,nam2) AS
(select 1, 'A1', 100, 'B1' union all
 select 2, 'B1', 50, 'B3' union all
 select 3, 'B1', 40, 'B2' union all
 select 4, 'B3', 60, 'B5' union all
 select 5, 'B2', 100, 'B6' union all
 select 6, 'B5', 100, 'B7'),
 cte as
 (select level=1,a.nam1,b.nam2,b.nam1 as nam3,b.qty from test a,test b where a.nam2=b.nam1 and a.nam1='A1'
  union all
  select level+1,b.nam1,a.nam2,a.nam1,b.qty from test a,cte b where a.nam1=b.nam2)
  select nam1,qty,nam2 from cte a where a.nam2 not in (select nam3 from cte)

热点排行