2015-08-31 156 views
0

我试过了各种样本,我发现通过搜索,我似乎无法得到我需要的结果。数据透视表列总数

我有以下代码

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获得小计。

然后,我需要把它放到一个表格或一些可以在网站上呈现的东西。

感谢您的协助。

回答

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 

让我知道这是行不通的。

+0

有几个语法差异,但我得到了那些解决和使用此代码 – Nestor

+0

酷!如果它适合你,请通过检查答案 – Utsav

+0

左侧的勾号接受答案。它不提供列总数,但行总数为 – Nestor