34,594
社区成员
发帖
与我相关
我的任务
分享
---测试数据---
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([yue] varchar(10),[新发展客户] int,[成交客户] int,[失败客户] int)
insert [tb]
select '2010年8月',0,0,0 union all
select '2010年7月',2,0,0 union all
select '2010年6月',0,0,0 union all
select '2010年5月',0,0,0 union all
select '2010年4月',0,0,0 union all
select '2010年3月',0,0,0 union all
select '2010年2月',0,0,0 union all
select '2010年1月',0,0,0 union all
select '2009年12月',0,0,0 union all
select '2009年11月',0,0,0 union all
select '2009年10月',0,0,0 union all
select '2009年9月',0,0,0 union all
select '2009年8月',0,0,0 union all
select '2009年7月',0,0,0
---查询---
declare @sql1 varchar(8000),@sql2 varchar(8000),@sql3 varchar(8000)
select
@sql1=isnull(@sql1+',','select ''新发展客户'' as type,')
+'sum(case when yue='''+yue+''' then 新发展客户 else 0 end) as ['+yue+']'
from
(select distinct yue from tb) t
select
@sql2=isnull(@sql2+',','select ''成交客户'' as type,')
+'sum(case when yue='''+yue+''' then 成交客户 else 0 end) as ['+yue+']'
from
(select distinct yue from tb) t
select
@sql3=isnull(@sql3+',','select ''失败客户'' as type,')
+'sum(case when yue='''+yue+''' then 失败客户 else 0 end) as ['+yue+']'
from
(select distinct yue from tb) t
exec (@sql1+' from tb union all '+@sql2+' from tb union all '+@sql3+' from tb')
---结果---
type 2009年10月 2009年11月 2009年12月 2009年7月 2009年8月 2009年9月 2010年1月 2010年2月 2010年3月 2010年4月 2010年5月 2010年6月 2010年7月 2010年8月
---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
新发展客户 0 0 0 0 0 0 0 0 0 0 0 0 2 0
成交客户 0 0 0 0 0 0 0 0 0 0 0 0 0 0
失败客户 0 0 0 0 0 0 0 0 0 0 0 0 0 0
(3 行受影响)
--> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([yue] [nvarchar](10),[新发展客户] [int],[成交客户] [int],[失败客户] [int])
INSERT INTO [tb]
SELECT '2010年8月','0','0','0' UNION ALL
SELECT '2010年7月','2','0','0' UNION ALL
SELECT '2010年6月','0','0','0' UNION ALL
SELECT '2010年5月','0','0','0' UNION ALL
SELECT '2010年4月','0','0','0' UNION ALL
SELECT '2010年3月','0','0','0' UNION ALL
SELECT '2010年2月','0','0','0' UNION ALL
SELECT '2010年1月','0','0','0' UNION ALL
SELECT '2009年12月','0','0','0' UNION ALL
SELECT '2009年11月','0','0','0' UNION ALL
SELECT '2009年10月','0','0','0' UNION ALL
SELECT '2009年9月','0','0','0' UNION ALL
SELECT '2009年8月','0','0','0' UNION ALL
SELECT '2009年7月','0','0','0'
--SELECT * FROM [tb]
-->SQL查询如下:
DECLARE @c VARCHAR(MAX)
SET @c=STUFF((SELECT ','+QUOTENAME(yue) FROM tb ORDER BY LEFT(yue,4) DESC,REPLACE(STUFF(yue,1,5,''),'月','')*1 DESC FOR XML PATH('')),1,1,'')
EXEC('
SELECT *
FROM tb
UNPIVOT(val FOR col IN (新发展客户,成交客户,失败客户)) b
PIVOT(MAX(val) FOR yue IN('+@c+')) c
ORDER BY CHARINDEX(LEFT(col,1),''新成失'')
')
/*
col 2010年8月 2010年7月 2010年6月 2010年5月 2010年4月 2010年3月 2010年2月 2010年1月 2009年12月 2009年11月 2009年10月 2009年9月 2009年8月 2009年7月
新发展客户 0 2 0 0 0 0 0 0 0 0 0 0 0 0
成交客户 0 0 0 0 0 0 0 0 0 0 0 0 0 0
失败客户 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*/
排序一下--> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([yue] [nvarchar](10),[新发展客户] [int],[成交客户] [int],[失败客户] [int])
INSERT INTO [tb]
SELECT '2010年8月','0','0','0' UNION ALL
SELECT '2010年7月','2','0','0' UNION ALL
SELECT '2010年6月','0','0','0' UNION ALL
SELECT '2010年5月','0','0','0' UNION ALL
SELECT '2010年4月','0','0','0' UNION ALL
SELECT '2010年3月','0','0','0' UNION ALL
SELECT '2010年2月','0','0','0' UNION ALL
SELECT '2010年1月','0','0','0' UNION ALL
SELECT '2009年12月','0','0','0' UNION ALL
SELECT '2009年11月','0','0','0' UNION ALL
SELECT '2009年10月','0','0','0' UNION ALL
SELECT '2009年9月','0','0','0' UNION ALL
SELECT '2009年8月','0','0','0' UNION ALL
SELECT '2009年7月','0','0','0'
--SELECT * FROM [tb]
-->SQL查询如下:
DECLARE @c VARCHAR(MAX)
SET @c=STUFF((SELECT ','+QUOTENAME(yue) FROM tb ORDER BY LEFT(yue,4) DESC,REPLACE(STUFF(yue,1,5,''),'月','')*1 DESC FOR XML PATH('')),1,1,'')
EXEC('
SELECT *
FROM tb
UNPIVOT(val FOR col IN (新发展客户,成交客户,失败客户)) b
PIVOT(MAX(val) FOR yue IN('+@c+')) c
')
/*
col 2010年8月 2010年7月 2010年6月 2010年5月 2010年4月 2010年3月 2010年2月 2010年1月 2009年12月 2009年11月 2009年10月 2009年9月 2009年8月 2009年7月
成交客户 0 0 0 0 0 0 0 0 0 0 0 0 0 0
失败客户 0 0 0 0 0 0 0 0 0 0 0 0 0 0
新发展客户 0 2 0 0 0 0 0 0 0 0 0 0 0 0
*/
--> 测试数据: [tb]
if object_id('[tb]') is not null drop table [tb]
create table [tb] (yue varchar(10),新发展客户 int,成交客户 int,失败客户 int)
insert into [tb]
select '2010年8月',0,0,0 union all
select '2010年7月',2,0,0 union all
select '2010年6月',0,0,0 union all
select '2010年5月',0,0,0 union all
select '2010年4月',0,0,0 union all
select '2010年3月',0,0,0 union all
select '2010年2月',0,0,0 union all
select '2010年1月',0,0,0 union all
select '2009年12月',0,0,0 union all
select '2009年11月',0,0,0 union all
select '2009年10月',0,0,0 union all
select '2009年9月',0,0,0 union all
select '2009年8月',0,0,0 union all
select '2009年7月',0,0,0
go
declare @f1 varchar(8000),@f2 varchar(8000),@f3 varchar(8000)
select @f1='',@f2='',@f3=''
select @f1=@f1+',['+yue+']='''+ltrim(新发展客户)+''''
,@f2=@f2+','''+ltrim(成交客户)+''''
,@f3=@f3+','''+ltrim(失败客户)+''''
from tb
exec('select 类型=''新发展客户'''+@f1
+' union all select ''成交客户'''+@f2
+' union all select ''失败客户'''+@f3)
go
--结果:
类型 2010年8月 2010年7月 2010年6月 2010年5月 2010年4月 2010年3月 2010年2月 2010年1月 2009年12月 2009年11月 2009年10月 2009年9月 2009年8月 2009年7月
---------- ------- ------- ------- ------- ------- ------- ------- ------- -------- -------- -------- ------- ------- -------
新发展客户 0 2 0 0 0 0 0 0 0 0 0 0 0 0
成交客户 0 0 0 0 0 0 0 0 0 0 0 0 0 0
失败客户 0 0 0 0 0 0 0 0 0 0 0 0 0 0