天天看点

sql交叉表

ALTER proc [dbo].[P401C统计来源来电数量]

(

 @统计期限种类代码 varchar(50)

)

as

CREATE TABLE #mpsl

(

 统计期限种类代码 int,

 统计期限种类 varchar(50),

 统计汇总种类代码 int,

 统计周期 varchar(50),

 统计分析大类 varchar(50),

 统计分析小类 varchar(50),

 统计数量 int ,

 小计 INT

)

--填充临时表数据

insert into #mpsl

SELECT     FT20统计项目开发日期_1.统计期限种类代码, FT20统计项目开发日期_1.统计期限种类,dbo.T040B统计汇总种类.统计汇总种类代码, FT20统计项目开发日期_1.统计周期,

                      CASE 统计汇总种类 WHEN '按开发人员' THEN 所属部门名称 WHEN '按所属地域' THEN 二级地域名称 WHEN '按项目应用' THEN 应用领域种类 WHEN '按项目来源' THEN

                       营销来源种类 WHEN '按重要程度' THEN 毛坯重要程度 END AS 统计分析大类,

                      CASE 统计汇总种类 WHEN '按开发人员' THEN 员工登记姓名 WHEN '按所属地域' THEN 所属地域名称 WHEN '按项目应用' THEN 应用领域大类 WHEN '按项目来源' THEN

                       营销来源分类 WHEN '按重要程度' THEN 毛坯重要程度 END AS 统计分析小类, COUNT(dbo.T200A项目登记名称.项目登记名称) AS 统计数量,SUM(COUNT(dbo.T200A项目登记名称.项目登记名称)) OVER (PARTITION BY  CASE 统计汇总种类 WHEN '按开发人员' THEN 员工登记姓名 WHEN '按所属地域' THEN 所属地域名称 WHEN '按项目应用' THEN 应用领域大类 WHEN '按项目来源' THEN

                       营销来源分类 WHEN '按重要程度' THEN 毛坯重要程度 END) AS 小计

FROM         dbo.FT20统计项目开发日期(@统计期限种类代码) AS FT20统计项目开发日期_1 INNER JOIN

                      dbo.T200A项目登记名称 ON FT20统计项目开发日期_1.项目登记名称代码 = dbo.T200A项目登记名称.项目登记名称代码 INNER JOIN

                      dbo.V161A所属地域名称 ON dbo.T200A项目登记名称.所属地域名称代码 = dbo.V161A所属地域名称.所属地域名称代码 INNER JOIN

                      dbo.T200B毛坯重要程度 ON dbo.T200A项目登记名称.毛坯重要程度代码 = dbo.T200B毛坯重要程度.毛坯重要程度代码 INNER JOIN

                      dbo.T200B项目应用领域 ON dbo.T200A项目登记名称.项目应用领域代码 = dbo.T200B项目应用领域.项目应用领域代码 INNER JOIN

                      dbo.V113A名册所有员工 ON dbo.T200A项目登记名称.登记确认用户 = dbo.V113A名册所有员工.员工登记姓名代码 INNER JOIN

                      dbo.V194A项目来源名称 ON dbo.T200A项目登记名称.营销来源种类代码 = dbo.V194A项目来源名称.营销来源种类代码 CROSS JOIN

                      dbo.T040B统计汇总种类

WHERE     (dbo.T200A项目登记名称.复核确认状态 = 1) and 统计汇总种类代码=1 AND dbo.V194A项目来源名称.营销来源种类='来电信息'

GROUP BY FT20统计项目开发日期_1.统计期限种类代码, dbo.T040B统计汇总种类.统计汇总种类代码, FT20统计项目开发日期_1.统计周期, FT20统计项目开发日期_1.统计期限种类,

                      CASE 统计汇总种类 WHEN '按开发人员' THEN 所属部门名称 WHEN '按所属地域' THEN 二级地域名称 WHEN '按项目应用' THEN 应用领域种类 WHEN '按项目来源' THEN

                       营销来源种类 WHEN '按重要程度' THEN 毛坯重要程度 END,

                      CASE 统计汇总种类 WHEN '按开发人员' THEN 员工登记姓名 WHEN '按所属地域' THEN 所属地域名称 WHEN '按项目应用' THEN 应用领域大类 WHEN '按项目来源' THEN

                       营销来源分类 WHEN '按重要程度' THEN 毛坯重要程度 END

HAVING      (CASE 统计汇总种类 WHEN '按开发人员' THEN 员工登记姓名 WHEN '按所属地域' THEN 所属地域名称 WHEN '按项目应用' THEN 应用领域大类 WHEN '按项目来源' THEN

                       营销来源分类 WHEN '按重要程度' THEN 毛坯重要程度 END IS NOT NULL) AND

                      (CASE 统计汇总种类 WHEN '按开发人员' THEN 所属部门名称 WHEN '按所属地域' THEN 二级地域名称 WHEN '按项目应用' THEN 应用领域种类 WHEN '按项目来源' THEN

                       营销来源种类 WHEN '按重要程度' THEN 毛坯重要程度 END IS NOT NULL)

insert into #mpsl SELECT DISTINCT

                      dbo.T040B统计期限种类.统计期限种类代码, dbo.T040B统计期限种类.统计期限种类,dbo.T040B统计汇总种类.统计汇总种类代码,

                      '前' + dbo.T040B统计期限期数.统计期限期数 + '期' AS 统计周期, '测试大类' AS 统计分析大类, '测试小类' AS 统计分析小类, 0 AS 统计数量,0 as 小计

FROM         dbo.T040B统计期限期数 CROSS JOIN

                      dbo.T040B统计期限种类 CROSS JOIN

                      dbo.T040B统计汇总种类

WHERE     (dbo.T040B统计汇总种类.统计汇总种类代码 =1)

-- 填充完成

-- 交叉表执行

declare @sql varchar(8000)

set @sql = 'select 统计期限种类, 统计分析大类,统计分析小类,'

select @sql = @sql + 'sum(case 统计周期 when '''+统计周期+''' then 统计数量 else 0 end) as '''+统计周期+''','from (select distinct 统计周期 from #mpsl) as a

select @sql = left(@sql,len(@sql)-1) + ' ,小计 from #mpsl where 统计期限种类代码 like '''+@统计期限种类代码+''' group by 统计分析大类,统计分析小类,统计期限种类代码,统计期限种类,小计'

exec(@sql) 

-- 交叉表执行完成

--删除临时表 

drop table #mpsl