SQL добавить несколько вычисляемых строк после использования сводной - PullRequest
0 голосов
/ 27 июня 2018

У меня есть таблица данных, которая выглядит следующим образом:

|Agency|Rating     |AVG|
------------------------
|Army  |Exceptional|10 |
|Navy  |Very Good  |8.5|

И мне нужно повернуть / посчитать число каждого типа рейтинга, а также вычислить итоги и проценты для каждой категории рейтинга, чтобы это выглядело так:

|Rating        |Army|Navy|
--------------------------
|Exceptional   |1   |0   |
|Very Good     |0   |1   |
|Satisfactory  |0   |0   |
|Marginal      |0   |0   |
|Unsatisfactory|0   |0   |
|Total         |1   |1   |
|% of Ex       |100 |0   |
|% of VG       |0   |100 |
|% of Sat      |0   |0   |
|% of Mar      |0   |0   |
|% of Uns      |0   |0   |

Использование следующего запроса:

select RatingWords as Rating, case when grouping([RatingWords]) = 1 then 
'Total' else [RatingWords] end as [RatingWords], Sum([Navy]) as Navy, 
sum([Army]) as Army
from
(select ratingwords, agency,
CASE WHEN Average BETWEEN 8.6 AND 10 THEN 1 else 0 end as Exceptional,
case WHEN Average BETWEEN 7.1 AND 8.5 THEN 1 else 0 end as VeryGood,
case WHEN Average BETWEEN 3.1 AND 7.0 THEN 1  else 0 end as Satisfactory,
case WHEN Average BETWEEN 0.1 AND 3.0 THEN 1 else 0 end as Marginal,
case WHEN Average = 0 THEN 1 ELSE 0 END as Unsatisfactory
from dbo.DOD_Average) as sourcetable
pivot
(
Count(exceptional)
for Agency in ([Navy], [Army])
) as PivotTable
group by grouping sets ((RatingWords),())

Я получаю следующую таблицу:

|Rating        |Army|Navy|
--------------------------
|Exceptional   |1   |0   |
|Very Good     |0   |1   |
|Satisfactory  |0   |0   |
|Marginal      |0   |0   |
|Unsatisfactory|0   |0   |
|Total         |1   |1   |

Итак, мой вопрос, как я могу добавить другую группу ниже строки Всего для вычисления процентов? Или, если это не лучший способ создать этот отчет, я готов его переработать.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Сохранение вышеуказанного запроса в табличной переменной и UNION ALL процент запросов. Как то так:

Declare @table table (Rating nvarchar(60), Army int, Navy int);
Insert into @table 
select RatingWords as Rating, case when grouping([RatingWords]) = 1 then 
'Total' else [RatingWords] end as [RatingWords], Sum([Navy]) as Navy, 
sum([Army]) as Army
from
(select ratingwords, agency,
CASE WHEN Average BETWEEN 8.6 AND 10 THEN 1 else 0 end as Exceptional,
case WHEN Average BETWEEN 7.1 AND 8.5 THEN 1 else 0 end as VeryGood,
case WHEN Average BETWEEN 3.1 AND 7.0 THEN 1  else 0 end as Satisfactory,
case WHEN Average BETWEEN 0.1 AND 3.0 THEN 1 else 0 end as Marginal,
case WHEN Average = 0 THEN 1 ELSE 0 END as Unsatisfactory
from dbo.DOD_Average) as sourcetable
pivot
(
Count(exceptional)
for Agency in ([Navy], [Army])
) as PivotTable
group by grouping sets ((RatingWords),())

Declare @army int, @navy int;
Select @army = Army, @navy = Navy from @table where Rating = 'Total';

Select * from @table
union all
Select '% of'+Rating, (Army/@army)*100, (Navy/@navy)*100 from @table 
where Rating <> 'Total'
0 голосов
/ 27 июня 2018

Используя ваш существующий запрос в качестве CTE, вы можете SELECT * из него и последовать за ним с помощью серии UNION ALL запросов, которые получают каждый желаемый процентный ряд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...