读书人

请问一句SQL多谢

发布时间: 2012-01-07 21:41:55 作者: rapoo

请教一句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
*/

读书人网 >SQL Server

热点推荐