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

请问一句SQL,多谢

2012-01-07 
请教一句SQL,谢谢!表一如下:IDProNameNUMProColorProSize1产品1黑10012产品1白1002表二如下:IDSize1001S10

请教一句SQL,谢谢!
表一如下:
ID         ProName         NUM         ProColor         ProSize
1               产品             1               黑                   1001
2               产品             1               白                   1002
表二如下:
ID             Size
1001           S
1002           M
1003           L

要求输出:
ProName         ProColor         S         M         L
产品                   黑               1         0         0
产品                   白               0         1         0

[解决办法]
declare @t1 table(ID int, ProName varchar(10),NUM int ,ProColor varchar(20), ProSize varchar(10))
insert into @t1 select 1, '产品 ',1, '黑 ', '1001 '
union all select 2, '产品 ',1, '白 ', '1002 '

declare @t2 table(ID varchar(10),Size varchar(5))
insert into @t2 select '1001 ', 'S '
union all select '1002 ', 'M '
union all select '1003 ', 'L '

select * from
(
select ProName,ProColor,Size from @t1 a right join @t2 b
on a.ProSize=b.ID
)tb
pivot
(count(size)
for size in ([S],[M],[L])
)as pit
where ProName is not null
order by ProColor desc

/*
ProName ProColor S M L
---------- -------------------- ----------- ----------- -----------
产品 黑 1 0 0
产品 白 0 1 0

(2 行受影响)

*/
[解决办法]
if object_id( 'pubs..表一 ') is not null
drop table 表一
go

create table 表一(ID int,ProName varchar(10),NUM int,ProColor varchar(10),ProSize int)
insert into 表一(ID,ProName,NUM,ProColor,ProSize) values(1, '产品 ',1, '黑 ', '1001 ')
insert into 表一(ID,ProName,NUM,ProColor,ProSize) values(2, '产品 ',1, '白 ', '1002 ')
if object_id( 'pubs..表二 ') is not null
drop table 表二
go

create table 表二(ID int,Size varchar(10))
insert into 表二(ID,Size) values(1001, 'S ')
insert into 表二(ID,Size) values(1002, 'M ')
insert into 表二(ID,Size) values(1003, 'L ')

select proname , procolor ,
(case when size = 'S ' then 1 else 0 end) as S,
(case when size = 'M ' then 1 else 0 end) as M,
(case when size = 'L ' then 1 else 0 end) as L
from
(
select a.proname,a.procolor,b.size from 表一 a,表二 b where a.prosize = b.id
) t

drop table 表一,表二
/*
proname procolor S M L
---------- ---------- ----------- ----------- -----------


产品 黑 1 0 0
产品 白 0 1 0

(所影响的行数为 2 行)
*/
[解决办法]

declare @t1 table(ID int, ProName varchar(10),NUM int ,ProColor varchar(20), ProSize varchar(10))
insert into @t1 select 1, '产品 ',1, '黑 ', '1001 '
union all select 2, '产品 ',1, '白 ', '1002 '

declare @t2 table(ID varchar(10),Size varchar(5))
insert into @t2 select '1001 ', 'S '
union all select '1002 ', 'M '
union all select '1003 ', 'L '


select a.ID,a.ProName,sum(case when ProSize= '1001 ' then NUM else 0 end) as S,
sum(case when ProSize= '1002 ' then NUM else 0 end) as M,
sum(case when ProSize= '1003 ' then NUM else 0 end) as L
FROM @t1 a left join @t2 b on a.ProSize=b.Size
group by a.ID,a.ProName

[解决办法]
一樓的語句是在SQL 2005下用的。二三樓的語句是在表二的ID固定的情況下用的。

如果表二的ID不是固定那麼幾種,要用動態SQL語句。

[解决办法]
if object_id( 'pubs..表一 ') is not null
drop table 表一
go

create table 表一(ID int,ProName varchar(10),NUM int,ProColor varchar(10),ProSize int)
insert into 表一(ID,ProName,NUM,ProColor,ProSize) values(1, '产品 ',1, '黑 ', '1001 ')
insert into 表一(ID,ProName,NUM,ProColor,ProSize) values(2, '产品 ',1, '白 ', '1002 ')
insert into 表一(ID,ProName,NUM,ProColor,ProSize) values(2, '产品 ',1, '白 ', '1001 ')
insert into 表一(ID,ProName,NUM,ProColor,ProSize) values(2, '产品 ',1, '白 ', '1003 ')
if object_id( 'pubs..表二 ') is not null
drop table 表二
go

create table 表二(ID int,Size varchar(10))
insert into 表二(ID,Size) values(1001, 'S ')
insert into 表二(ID,Size) values(1002, 'M ')
insert into 表二(ID,Size) values(1003, 'L ')
insert into 表二(ID,Size) values(1004, 'XL ')
insert into 表二(ID,Size) values(1005, 'XXL ')
insert into 表二(ID,Size) values(1006, 'XXXL ')
go

declare @sql varchar(8000)
set @sql = 'select ProName , ProColor '
select @sql = @sql + ' , max(case size when ' ' ' + size + ' ' ' then 1 else 0 end) [ ' + size + '] '
from (select distinct size from (select a.ProName , a.ProColor,b.size from 表一 a,表二 b where a.prosize = b.id) t) as m
set @sql = @sql + ' from (select a.ProName , a.ProColor,b.size from 表一 a,表二 b where a.prosize = b.id) t group by ProName , ProColor '
exec(@sql)

drop table 表一,表二
/*
ProName ProColor L M S
---------- ---------- ----------- ----------- -----------
产品 白 1 1 1
产品 黑 0 0 1
*/

热点排行