简体   繁体   English

使用SQL数据透视表的行/列总计汇总表

[英]Summary table with row/column totals using SQL pivot

I need help with SQL for generating pivot table with row/column totals calculated ..I have 2 tables as given below 我需要有关SQL的帮助,以生成具有计算的行/列总数的数据透视表..我有以下两个表

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

and I would like to generate a pivot table with row/column total percentages as shown below. 并且我想生成一个具有行/列总百分比的数据透视表,如下所示。 I have tried combination of 'pivot' and 'group by' but could not get the row & column total accurately 我曾尝试将“数据透视”和“分组依据”组合使用,但无法准确获取行和列的总数

Probelm Summary view: Probelm摘要视图:

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 

this should give what you need except the Total row at the bottom. 除了底部的“ Total行外,这应会提供所需的内容。

Here's a PIVOT query you can work with.. your example has prodcat in one table and probcat in the other.. not sure if that was typo in second table so i just with with probcat for both. 这里有一个PIVOT查询,你可以用你的..例如已经工作prodcat在一个表和probcat在其他..不知道这是否是错字在第二个表,所以我只是用probcat两种。 should be easy to fix it it gives you an error 应该很容易修复它给你一个错误

;
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

Just like others mentioned, your summary/total calculation should be done on the presentation layer. 就像其他人提到的那样,您的摘要/总计计算应在表示层上进行。 But here is my attempt to getting your output minus the last summary line: 但是,这是我尝试使您的输出减去最后的摘要行:

;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 SQL小提琴演示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM