2015-07-14 3 views
1

мне нужна помощь с SQL для создания сводной таблицы с суммами строк/столбцов рассчитываются .иЕ есть 2 таблицы, как указано нижеСводной таблицы с суммами строк/столбцов с использованием 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 

и я хотел бы, чтобы генерировать сводную таблицу с общим количеством строк/столбцов, как показано ниже. Я попытался сочетание «поворота» и «группы по», но не мог получить в общей сложности столбец строки & точно

вид

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(%) 
+3

строка с общим должно быть оставлено на уровне представления. Не sql-сервер. – mxix

+0

Я согласен .... Я играл с этим, и для достижения того, что вы хотите, очень сложно использовать, по сравнению с тем, насколько простым было бы вычисление итогов строк и столбцов в уровне представления. –

+0

Спасибо за отзыв, я смог достичь этого с помощью сочетания уровня запросов и презентаций для вычисления общего количества столбцов. –

ответ

0

Так же, как другие уже упоминалось, ваше резюме/общее вычисление должно быть сделано на уровне представления. Но вот моя попытка получения вашего выхода минус последнюю итоговую строку:

;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

0
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 строка внизу.

+0

Спасибо, что предоставили запрос. Мне удалось решить все ответы –

0

Вот PIVOT запрос вы можете работать с .. ваш пример имеет в одной таблице и probcat в другой prodcat .. не уверен, если это была опечатка во второй таблице, так что я просто с с 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 
+0

Спасибо, что предоставили запрос, я смог решить все ответы –

Смежные вопросы