使用计算列动态生成的sql pivot通用方法

使用计算列动态生成的sql pivot通用方法,sql,Sql,我有以下情况: 生成具有动态列的透视,我可以通过在客户端或存储过程中生成动态sql来管理该透视 然后,我需要根据枢轴已经计算的值计算附加值 以下是生成流程中所有步骤的sql: IF OBJECT_ID('dbo.departmentStats', 'U') IS NOT NULL DROP TABLE dbo.departmentStats; CREATE TABLE departmentStats ([Facility] varchar(50), [Department] varchar(5

我有以下情况: 生成具有动态列的透视,我可以通过在客户端或存储过程中生成动态sql来管理该透视

然后,我需要根据枢轴已经计算的值计算附加值

以下是生成流程中所有步骤的sql:

IF OBJECT_ID('dbo.departmentStats', 'U') IS NOT NULL
DROP TABLE dbo.departmentStats;

CREATE TABLE departmentStats
([Facility] varchar(50), [Department] varchar(50),[Stat] varchar(5),      
[January] int, [February] int, [March] int);

INSERT INTO departmentStats
([Facility],[Department],[Stat], [January], [February], [March])
VALUES
('f1','d1','Stat1', 90, 40, 60),
('f1','d1','Stat2', 30, 20, 10);

select 'Original Data' as src,* from departmentStats

IF OBJECT_ID('tempdb.dbo.#pivotstats', 'U') IS NOT NULL
DROP TABLE #pivotstats;

 CREATE TABLE #pivotstats
(facility varchar(50),department varchar(50),stat VARCHAR(50),period   
 varchar(50),value  int)

 insert into #pivotstats
select facility,department,Stat, period, value
from departmentStats
unpivot
(
  value
  for Period in (January, February, March)
) u 

select 'Original after unpivot' as src,* from #pivotstats


IF OBJECT_ID('dbo.departmentStats2', 'U') IS NOT NULL
DROP TABLE dbo.departmentStats2;

CREATE TABLE departmentStats2
([Facility] varchar(50), [Department] varchar(50),[Period] varchar(20),    
[stat1] int, [stat2] int, [Sum] numeric(10,2),[Division] numeric(10,2));

insert into departmentStats2
select
facility
,department
,period
,Stat1
,stat2
,Stat1+Stat2 as [sum]
,case when Stat2<>0 then cast(Stat1/Stat2 AS numeric) else 0.0 end as  
 division
 from #pivotstats
  Pivot(
   sum(value) 
    for Stat in ([Stat1],[Stat2])
  ) 
  as x

select 'Added formula columns' as src,* from departmentStats2

select  'Union and repivot' as src,* from (
select 
facility
,department
,Period
,'Stat1' as Stat
,stat1 as value
from departmentStats2

union all
select 
facility
,department
,Period
,'Stat2' as Stat
,stat2 as value
from departmentStats2

union all

select 
facility
,department
,Period
,'sum' as Stat
,[SUM] as value
from departmentStats2

union all
select 
facility
,department
,Period
,'Division' as Stat
,[Division] as value
from departmentStats2
 ) as bunion
pivot(
    sum(value)
    for Period in (January, February, March)
)as P

对于那个没有研究成果就打倒我的人。这项研究都是为了提出方法本身。我很抱歉没有引用我在过去几天里读到的每一篇文章,在这些文章中,我只发现了如何通过使用动态sql创建一个存储过程来创建动态pivot,该过程将字段名插入pivot子句。好了,这里的其他所有东西都是我刚想到的,我想看看其他人怎么想。这里有一个更好的方法来完成最后一步的联合和轴心。您的代码是否遇到了特定的问题,或者您是在要求我们吗?征求对一般方法的意见。pivot/UnPivot的组合,以及可能通过.Net ADO或动态SQL添加更多列的组合,这两种方式根据用户的喜好而定。
select  'Union and repivot' as src,* from (

select       
 departmentStats2.Facility,
departmentStats2.Department,Departmentstats2.period,x.stat,x.value
from
 departmentStats2
  cross Apply(
        values(Facility,Department,Period,'1_Sales',Sales),
               (Facility,Department,Period,'2_Cost',Cost),
               (Facility,Department,Period,'3_GrossProfit',GrossProfit),
               (Facility,Department,Period,'4_GPP',GPP)
) as x(Facility,Department,Period,Stat,[Value])
 )as P
    pivot(
       sum(value)
       for Period in (January, February, March)
    )as P
    order by Facility,department,Stat