与列总计的数据透视表

时间:2015-08-31 23:45:52

标签: sql sql-server-2012 pivot-table summary

我尝试过通过搜索找到的各种样本,但我似乎无法得到我需要的结果。

我有以下代码

SELECT * FROM
(
 SELECT CR_RDate, PO_Num, RepName, CP_Amt, CS_ID, CS_Desc FROM  dbo.v_CommRP 
) as
PIVOT
(
  SUM(CP_Amt)
  FOR CS_Desc IN ([Cat1], Cat2], [Cat3])
 ) AS pv_CPR
ORDER BY CR_RDate, PO_Num, CS_ID

它会创建以下数据透视表

CR_RDate    PO_Num  CR_Amt      RepName     CS_ID   Cat1    Cat2    Cat3
8/24/2015   166090  $100.00     Agent 1     2   NULL    $35.00  NULL
8/24/2015   166090  $100.00     Agent 2     3   NULL    NULL    $32.50 
8/24/2015   166090  $100.00     Agent 3     3   NULL    NULL    $32.50 
8/24/2015   2528968 $200.00     Agent 1     2   NULL    $70.00  NULL
8/24/2015   2528968 $200.00     Agent 2     3   NULL    NULL    $65.00 
8/24/2015   2528968 $200.00     Agent 3     3   NULL    NULL    $65.00 
8/31/2015   166090  $200.00     Agent 1     2   NULL    $70.00  NULL
8/31/2015   166090  $200.00     Agent 2     3   NULL    NULL    $65.00 
8/31/2015   166090  $200.00     Agent 3     3   NULL    NULL    $65.00

我需要的是Cat1,Cat2和Cat3的总数。理想情况下,我可以通过CR_Date和PO_Num获得小计。

然后我需要把它放在一张桌子或可以在网站上展示的东西上。

感谢您的协助。

1 个答案:

答案 0 :(得分:0)

你可以试试下面这样的东西,让我知道这是否有效。 我假设列Cat1,Cat2和Cat3是varchar。

我在CTE中使用了您的查询,并从Cat列中删除了'$'。然后我拿出他们的总和,并连接'$'符号。这个添加/删除在Oracle 12c中运行良好。

with pv as
( 
    SELECT * FROM
    (
     SELECT CR_RDate, PO_Num, RepName, CP_Amt, CS_ID, CS_Desc FROM  dbo.v_CommRP 
    ) as
    PIVOT
    (
      SUM(CP_Amt)
      FOR CS_Desc IN ([Cat1], Cat2], [Cat3])
     ) AS pv_CPR
    ORDER BY CR_RDate, PO_Num, CS_ID

)
select pv.*, '$'||cast(replace(coalesce(Cat1,'0'),'$','')+replace(coalesce(Cat2,'0'),'$','')+replace(coalesce(Cat3,''),'$','0') as varchar2(20))  as Total
 from pv

如果这不起作用,请告诉我。