在TSQL中创建像Pivot一样的Excel

时间:2017-05-28 08:36:00

标签: sql sql-server tsql pivot grouping

我有一张表,目前持有基于Territory的销售数据>面积>群集>区域>分割。我需要的是基本上得到的输出,可以在按钮的每个级别显示汇总。

select 
   TS.Cycle,
   Segment, 
   Region,
   Cluster,
   Area,
   TS.TargetDesc, 
   Sum(TS.Target) as TGT,
   sum(A.Achivement) as ACH, 
   0 as [lvl] 
from MST_TargetSetup TS
join MST_AchivementSetup A on 
    TS.TargetDesc = A.AchivementDesc and Ts.TargetType='T' and 
    A.AchivementType='T' and 
    (cast(Ts.Month as varchar(5))+'-'+cast(Ts.Year as varchar(5)))=(cast(A.Month as varchar(5))+'-'+cast(A.Year as varchar(5)))
join MST_EmployeeMaster E on TS.TargetDesc=E.Terriory
Group by TS.TargetDesc, Area, Cluster, Region, Segment, TS.Cycle

以上查询为我提供以下输出:base output

现在作为输出我需要的是在每个级别汇总

  1. 细分
  2. 区域
  3. 群集
  4. TargetDesc
  5. 我尝试使用下面不同分组的联合,但它会在每个级别的顶部而不是底部创建汇总。

    select 
     TS.Cycle,Segment,Region,Cluster,Area,TS.TargetDesc, Sum(TS.Target) as TGT,sum(A.Achivement) as ACH from MST_TargetSetup TS
    join MST_AchivementSetup A on TS.TargetDesc = A.AchivementDesc and Ts.TargetType='T' and A.AchivementType='T' and (cast(Ts.Month as varchar(5))+'-'+cast(Ts.Year as varchar(5)))=(cast(A.Month as varchar(5))+'-'+cast(A.Year as varchar(5)))
    join MST_EmployeeMaster E on TS.TargetDesc=E.Terriory
    Group by TS.TargetDesc,Area,Cluster,Region,Segment,TS.Cycle
    union
    select 
     TS.Cycle,Segment,'' as Region,'' as Cluster,'' as Area,'' as TargetDesc, Sum(TS.Target) as TGT,sum(A.Achivement) as ACH from MST_TargetSetup TS
    join MST_AchivementSetup A on TS.TargetDesc = A.AchivementDesc and Ts.TargetType='T' and A.AchivementType='T' and (cast(Ts.Month as varchar(5))+'-'+cast(Ts.Year as varchar(5)))=(cast(A.Month as varchar(5))+'-'+cast(A.Year as varchar(5)))
    join MST_EmployeeMaster E on TS.TargetDesc=E.Terriory
    Group by Segment,TS.Cycle
    union
    select 
     TS.Cycle,Segment,Region,'' as Cluster,'' as Area,'' as TargetDesc, Sum(TS.Target) as TGT,sum(A.Achivement) as ACH from MST_TargetSetup TS
    join MST_AchivementSetup A on TS.TargetDesc = A.AchivementDesc and Ts.TargetType='T' and A.AchivementType='T' and (cast(Ts.Month as varchar(5))+'-'+cast(Ts.Year as varchar(5)))=(cast(A.Month as varchar(5))+'-'+cast(A.Year as varchar(5)))
    join MST_EmployeeMaster E on TS.TargetDesc=E.Terriory
    Group by Segment,Region,TS.Cycle
    union
    select 
     TS.Cycle,Segment,Region,cluster,'' as Area,'' as TargetDesc, Sum(TS.Target) as TGT,sum(A.Achivement) as ACH from MST_TargetSetup TS
    join MST_AchivementSetup A on TS.TargetDesc = A.AchivementDesc and Ts.TargetType='T' and A.AchivementType='T' and (cast(Ts.Month as varchar(5))+'-'+cast(Ts.Year as varchar(5)))=(cast(A.Month as varchar(5))+'-'+cast(A.Year as varchar(5)))
    join MST_EmployeeMaster E on TS.TargetDesc=E.Terriory
    Group by Segment,Region,cluster,TS.Cycle
    union
    select 
     TS.Cycle,Segment,Region,Cluster,Area,'' as TargetDesc, Sum(TS.Target) as TGT,sum(A.Achivement) as ACH from MST_TargetSetup TS
    join MST_AchivementSetup A on TS.TargetDesc = A.AchivementDesc and Ts.TargetType='T' and A.AchivementType='T' and (cast(Ts.Month as varchar(5))+'-'+cast(Ts.Year as varchar(5)))=(cast(A.Month as varchar(5))+'-'+cast(A.Year as varchar(5)))
    join MST_EmployeeMaster E on TS.TargetDesc=E.Terriory
    Group by Segment,Region,Cluster,Area,TS.Cycle
    

    输出:output with union

    如果您看到上面的输出汇总正在按预期工作,但它们显示在每个详细信息级别的顶部,而不是底部。

    需要帮助进行底部汇总。

1 个答案:

答案 0 :(得分:0)

您需要做的就是在基本输出查询中将group by子句更改为group by grouping sets

Grouping Sets Documentation

您可能不得不强迫NULL值与您在输出中使用union一样空白,但计算出的值将在每个级别匹配。

<强>答案:

select 
   TS.Cycle,
   Segment, 
   Region,
   Cluster,
   Area,
   TS.TargetDesc, 
   Sum(TS.Target) as TGT,
   sum(A.Achivement) as ACH, 
   0 as [lvl] 
from MST_TargetSetup TS
join MST_AchivementSetup A on 
    TS.TargetDesc = A.AchivementDesc and Ts.TargetType='T' and 
    A.AchivementType='T' and 
    (cast(Ts.Month as varchar(5))+'-'+cast(Ts.Year as varchar(5)))=(cast(A.Month as varchar(5))+'-'+cast(A.Year as varchar(5)))
join MST_EmployeeMaster E on TS.TargetDesc=E.Terriory
Group by grouping sets 
    (
        (TS.TargetDesc, Area, Cluster, Region, Segment, TS.Cycle) --lowest level
        , (Area, Cluster, Region, Segment, TS.Cycle)
        , (Cluster, Region, Segment, TS.Cycle)
        , (Region, Segment, TS.Cycle)
        , (Segment, TS.Cycle)
    )