27,579
社区成员
发帖
与我相关
我的任务
分享use test
go
if object_id('test.dbo.tb') is not null drop table tb
-- 创建数据表
create table tb
(
品号 char(5),
日期 datetime,
数量 int
)
go
--插入测试数据
insert into tb select 'T001','2010-01-01',100
union all select 'T001','2010-01-02',200
union all select 'T001','2010-01-03',300
union all select 'T002','2010-01-02',200
union all select 'T002','2010-01-03',300
go
--代码实现
declare @sql varchar(max)
select @sql=isnull(@sql+',[','[')+convert(varchar(10),日期,120)+']' from(select distinct 日期 from tb)a
exec('select 品号,'+@sql+'
from (
select tt.品号,tt.日期,数量=isnull(t.数量,0)
from tb t right join (
select * from (select distinct 日期 from tb)a,(select distinct 品号 from tb)b
)tt
on t.品号=tt.品号 and t.日期=tt.日期
)t
pivot(sum(数量) for 日期 in('+@sql+'))pvt')
/*测试结果
品号 2010-01-01 2010-01-02 2010-01-03
------------------------------------------
T001 100 200 300
T002 0 200 300
(2 行受影响)
*/
use test
go
if object_id('test.dbo.tb') is not null drop table tb
-- 创建数据表
create table tb
(
品号 char(5),
日期 datetime,
数量 int
)
go
--插入测试数据
insert into tb select 'T001','2010-01-01',100
union all select 'T001','2010-01-02',200
union all select 'T001','2010-01-03',300
union all select 'T002','2010-01-02',200
union all select 'T002','2010-01-03',300
go
--代码实现
declare @sql varchar(max)
select @sql=isnull(@sql+',[','[')+convert(varchar(10),日期,120)+']' from(select distinct 日期 from tb)a
select 品号,[2010-01-01],[2010-01-02],[2010-01-03]
from (
select tt.品号,tt.日期,数量=isnull(t.数量,0)
from tb t right join (
select * from (select distinct 日期 from tb)a,(select distinct 品号 from tb)b
)tt
on t.品号=tt.品号 and t.日期=tt.日期
)t
pivot(sum(数量) for 日期 in([2010-01-01],[2010-01-02],[2010-01-03]))pvt
/*测试结果
品号 2010-01-01 2010-01-02 2010-01-03
--------------------------------------------
T001 100 200 300
T002 0 200 300
(2 行受影响)
*/