使用 SQL 数据透视表汇总 table,总计 row/column

Summary table with row/column totals using SQL pivot

我需要有关 SQL 的帮助,以生成枢轴 table 并计算出总计 row/column ..我有 2 table 如下所示

Table ProbCat
==============
probcat | probdesc
1         minor
2         high
3         showstopper


Table ProbSummary
===================
prodcat | noofproblems | stage
1          5             Dev 
2          1             Dev 
3          6             QA
3          6             Prod

我想生成一个总百分比 row/column 的数据透视表 table,如下所示。我试过 'pivot' 和 'group by' 的组合,但无法准确获得行和列的总和

问题摘要视图:

ProbCategory  CategoryDesc  Dev   Qa   Prod    Total(%)
______________________________________________________
1             Minor          5     0    0       5(100*(5/18))
2             High           1     0    0       1(100*(1/18))
3             Showstopper    0     6    6       12(100*(6/18))
Total         NA             6(%)  6(%) 6(%)
with x as
(select p.probcat as probcategory, p.probdesc as categotydesc,
case when s.stage = 'Dev' and s.noofproblems > 0 then s.noofproblems else 0 end as Dev,
case when s.stage = 'QA' and s.noofproblems > 0 then s.noofproblems else 0 end as QA,
case when s.stage = 'Prod' and s.noofproblems > 0 then s.noofproblems else 0 end as Prod
from Probcat p join Probsummary s on p.probcat = s.prodcat)
select probcategory,categotydesc,Dev,QA,Prod, Dev+QA+Prod as Total
from x 

除底部的 Total 行外,这应该可以满足您的需求。

这是一个您可以使用的 PIVOT 查询。您的示例在一个 table 和另一个 probcat 中有 prodcat ..不确定那是否是第二个打字错误 table 所以我只用 probcat 来表示两者。应该很容易修复它给你一个错误

;
WITH ProbCatSummary AS
(
    SELECT  pc.probcat,
            pc.probdesc,
            SUM(ps.noofproblems) AS noofproblems
    FROM    ProbCat pc 
            JOIN ProbSummary ps ON pc.probcat = ps.probcat
    GROUP BY pc.probcat,
            pc.probdesc
)
SELECT  p.*,  
        [Total (%)] =   CONVERT(VARCHAR,[Dev] + [QA] + [Prod]) 
                        + ' (' + CONVERT(VARCHAR,  
                                    CAST(ROUND((([Dev] + [QA] + [Prod]) * 100.0 / SUM(ps.noofproblems) OVER()),2) AS DECIMAL(8,2))
                                ) 
                        + ')'
FROM (
    SELECT  probcat, probdesc, ISNULL([Dev],0)[Dev], ISNULL([QA],0)[QA], ISNULL([Prod],0)[Prod]
    FROM    (SELECT pc.probcat, probdesc, stage, noofproblems
            FROM    ProbCat pc 
                    JOIN ProbSummary ps ON pc.probcat = ps.probcat) AS s
    PIVOT (SUM(noofproblems) FOR stage IN ([Dev], [QA], [Prod])) AS p
) p JOIN ProbCatSummary ps ON p.probcat = ps.probcat

就像其他人提到的那样,您的 summary/total 计算应该在表示层上完成。但这是我尝试让你的输出减去最后的总结行:

;WITH Q1
AS (
    SELECT pvt.probcat
        ,pvt.probdesc
        ,ISNULL(pvt.[Dev], 0) AS 'Dev'
        ,ISNULL(pvt.[QA], 0) AS 'QA'
        ,ISNULL(pvt.[Prod], 0) AS 'Prod'
    FROM (
        SELECT pc.probcat
            ,pc.probdesc
            ,ps.noofproblems
            ,ps.stage
        FROM Probcat pc
        LEFT JOIN ProbSummary ps ON pc.probcat = ps.probcat
        ) t
    PIVOT(max(noofproblems) FOR stage IN (
                [Dev]
                ,[QA]
                ,[Prod]
                )) pvt
    ),
q2 as
(SELECT q1.*
    ,sum(q1.Dev + q1.QA + q1.Prod) AS Total
FROM q1

GROUP BY q1.probcat
    ,q1.probdesc
    ,q1.Dev
    ,q1.QA
    ,q1.Prod
)
select q2.probcat
    ,q2.probdesc
    ,q2.Dev
    ,q2.QA
    ,q2.Prod
    ,cast(q2.Total as varchar(10)) + ' (' +
    cast(cast((cast(q2.Total as decimal(5,2))/cast(d.CrossSum as decimal(5,2)))*100 
    as decimal(5,2)) as varchar(10))
    + '% )' as FinalTotal
    from q2
  CROSS APPLY (
    SELECT sum(q1.Dev + q1.QA + q1.Prod) AS CrossSum
    FROM q1
    ) d  
ORDER BY q2.probcat

SQL Fiddle Demo