现有:
TABLE A
ID PCODE DN PSD ISD
----------------------------------
1 01 AA 2008-12-20 2008-12-21
2 02 AA 2008-12-18 2008-12-20
3 03 AA 2008-12-21 2008-12-19
4 04 AA 2008-12-22 2008-12-20
5 01 BB 2008-12-18 2008-12-19
6 02 BB 2008-12-17 2008-12-18
7 03 BB 2008-12-19 2008-12-20
8 04 BB 2008-12-20 2008-12-20
9 01 CC 2008-12-22 <NULL>
10 02 CC <NULL> 2008-12-19 TABLE B
ID PCODE PN
------------
1 01 MM
2 02 NN
3 03 PP
4 04 QQ 要想得到以下查询结果:
RESULT
ID DN MMPSD MMISD NNPSD NNISD PPPSD PPISD QQPSD QQISD
1 AA 2008-12-20 2008-12-21 2008-12-18 2008-12-20 2008-12-21 2008-12-19 2008-12-22 2008-12-20
2 BB 2008-12-18 2008-12-19 2008-12-17 2008-12-18 2008-12-19 2008-12-20 2008-12-22 2008-12-20
3 CC 2008-12-22 <NULL> <NULL> 2008-12-19 <NULL> <NULL> <NULL> <NULL>
TABLE A
ID PCODE DN PSD ISD
----------------------------------
1 01 AA 2008-12-20 2008-12-21
2 02 AA 2008-12-18 2008-12-20
3 03 AA 2008-12-21 2008-12-19
4 04 AA 2008-12-22 2008-12-20
5 01 BB 2008-12-18 2008-12-19
6 02 BB 2008-12-17 2008-12-18
7 03 BB 2008-12-19 2008-12-20
8 04 BB 2008-12-20 2008-12-20
9 01 CC 2008-12-22 <NULL>
10 02 CC <NULL> 2008-12-19 TABLE B
ID PCODE PN
------------
1 01 MM
2 02 NN
3 03 PP
4 04 QQ 要想得到以下查询结果:
RESULT
ID DN MMPSD MMISD NNPSD NNISD PPPSD PPISD QQPSD QQISD
1 AA 2008-12-20 2008-12-21 2008-12-18 2008-12-20 2008-12-21 2008-12-19 2008-12-22 2008-12-20
2 BB 2008-12-18 2008-12-19 2008-12-17 2008-12-18 2008-12-19 2008-12-20 2008-12-22 2008-12-20
3 CC 2008-12-22 <NULL> <NULL> 2008-12-19 <NULL> <NULL> <NULL> <NULL>
insert into A values(1 , '01' , 'AA', '2008-12-20', '2008-12-21')
insert into A values(2 , '02' , 'AA', '2008-12-18', '2008-12-20')
insert into A values(3 , '03' , 'AA', '2008-12-21', '2008-12-19')
insert into A values(4 , '04' , 'AA', '2008-12-22', '2008-12-20')
insert into A values(5 , '01' , 'BB', '2008-12-18', '2008-12-19')
insert into A values(6 , '02' , 'BB', '2008-12-17', '2008-12-18')
insert into A values(7 , '03' , 'BB', '2008-12-19', '2008-12-20')
insert into A values(8 , '04' , 'BB', '2008-12-20', '2008-12-20')
insert into A values(9 , '01' , 'CC', '2008-12-22', NULL)
insert into A values(10, '02' , 'CC', NULL , '2008-12-19')
create table B(ID int, PCODE varchar(10) , PN varchar(10))
insert into b values(1 , '01' , 'MM')
insert into b values(2 , '02' , 'NN')
insert into b values(3 , '03' , 'PP')
insert into b values(4 , '04' , 'QQ')
go
--静态SQL
select
dn ,
max(case b.pn when 'mm' then psd end) mmpsd,
max(case b.pn when 'mm' then isd end) mmisd,
max(case b.pn when 'nn' then psd end) nnpsd,
max(case b.pn when 'nn' then isd end) nnisd,
max(case b.pn when 'pp' then psd end) pppsd,
max(case b.pn when 'pp' then isd end) ppisd,
max(case b.pn when 'qq' then psd end) qqpsd,
max(case b.pn when 'qq' then isd end) qqisd
from a , b
where a.pcode = b.pcode
group by dn
/*
dn mmpsd mmisd nnpsd nnisd pppsd ppisd qqpsd qqisd
---------- ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------
AA 2008-12-20 00:00:00.000 2008-12-21 00:00:00.000 2008-12-18 00:00:00.000 2008-12-20 00:00:00.000 2008-12-21 00:00:00.000 2008-12-19 00:00:00.000 2008-12-22 00:00:00.000 2008-12-20 00:00:00.000
BB 2008-12-18 00:00:00.000 2008-12-19 00:00:00.000 2008-12-17 00:00:00.000 2008-12-18 00:00:00.000 2008-12-19 00:00:00.000 2008-12-20 00:00:00.000 2008-12-20 00:00:00.000 2008-12-20 00:00:00.000
CC 2008-12-22 00:00:00.000 NULL NULL 2008-12-19 00:00:00.000 NULL NULL NULL NULL(所影响的行数为 3 行)
*/--动态SQL
declare @sql varchar(8000)
set @sql = 'select dn '
select @sql = @sql + ' , max(case b.pn when ''' + pn + ''' then psd end) [' + pn + 'psd]'
+ ' , max(case b.pn when ''' + pn + ''' then isd end) [' + pn + 'isd]'
from (select distinct pn from b) as t
set @sql = @sql + ' from a , b
where a.pcode = b.pcode
group by dn'
exec(@sql)
/*
dn MMpsd MMisd NNpsd NNisd PPpsd PPisd QQpsd QQisd
---------- ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------
AA 2008-12-20 00:00:00.000 2008-12-21 00:00:00.000 2008-12-18 00:00:00.000 2008-12-20 00:00:00.000 2008-12-21 00:00:00.000 2008-12-19 00:00:00.000 2008-12-22 00:00:00.000 2008-12-20 00:00:00.000
BB 2008-12-18 00:00:00.000 2008-12-19 00:00:00.000 2008-12-17 00:00:00.000 2008-12-18 00:00:00.000 2008-12-19 00:00:00.000 2008-12-20 00:00:00.000 2008-12-20 00:00:00.000 2008-12-20 00:00:00.000
CC 2008-12-22 00:00:00.000 NULL NULL 2008-12-19 00:00:00.000 NULL NULL NULL NULL
*/drop table a , b