2017-02-14 4 views
1

Я следующий запрос:Преобразование строк заголовков столбцов с итогами

SELECT 
    g.Gender, 
    a.AgeGroup, 
    count(*) as Count 
FROM 
    client c 
INNER JOIN AgeGroup a 
    ON c.age BETWEEN a.StartRange AND a.EndRange 
INNER JOIN Gender G on 
    C.GenderID = G.GenderID 
group by 
    g.Gender, 
    a.AgeGroup 
order by AgeGroup, Gender 

, который дает следующие результаты:

Gender  AgeGroup Count 
Male  <=25  4 
Unknown  <=25  2 
Female  >35   2223 
Male  >35   6997 
Transgender >35   43 
Unknown  >35   2 
Female  26-35  413 
Male  26-35  590 
Transgender 26-35  5 

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

AgeGroup Male Female Trans Unknown Total 
<= 25:  4  0  0  2  6 
26 - 35: 590  413  5  0  1008 
> 35:  6997 2223 43  2  9265 
Total:  7591 2636 48  4  10279 

Я получил это далеко:

SELECT * 
FROM (
    SELECT 
     g.Gender as [Gender], 
     a.AgeGroup 
FROM 
    client c 
INNER JOIN AgeGroup a 
    ON c.age BETWEEN a.StartRange AND a.EndRange 
INNER JOIN Gender G on 
    C.GenderID = G.GenderID 
) as s 
PIVOT 
(
    COUNT(Gender) 
    FOR [Gender] IN (Male,Female,Transgender,Unknown) 
)AS pvt 

, который возвращает это:

AgeGroup Male Female Transgender Unknown 
<=25  4  0  0   2 
26-35  590  413  5   0 
>35   6997 2223 43   2 

Но у меня нет итогов.

Есть ли способ, которым я могу это сделать?

+1

попытка отрываясь _pivot с count_, множество примеров [на сайте] (http://stackoverflow.com/search?q=%5Bsql-server%5D+pivot+with+count). – Tanner

+0

также, пожалуйста, постарайтесь опубликовать все как текст, если это возможно. В вашем случае (ожидаемые и фактические результаты). Также попробуйте включить образцы DDL, заявления DML – TheGameiswar

+0

Спасибо @Tanner, удалось выяснить это и обновить сообщение. Однако я не могу понять, как получить итоги. – Philip

ответ

1

Попробуйте это ..

SELECT *, 
(select sum(v) 
from 
(values(male), 
     (female), 
     (transgender), 
     (unknown)) 
     as val(v)) as total 
FROM (
    SELECT 
     g.Gender as [Gender], 
     a.AgeGroup 
FROM 
    client c 
INNER JOIN AgeGroup a 
    ON c.age BETWEEN a.StartRange AND a.EndRange 
INNER JOIN Gender G on 
    C.GenderID = G.GenderID 
) as s 
PIVOT 
(
    COUNT(Gender) 
    FOR [Gender] IN (Male,Female,Transgender,Unknown) 
)AS pvt 

Обновленные требования:
я рекомендую положить всю таблицу в некоторых временную таблицу для readabilty и сделать это

Таким образом, ваш выше запрос будет идти, как это

SELECT *, 
(select sum(v) 
from 
(values(male), 
     (female), 
     (transgender), 
     (unknown)) 
     as val(v)) as total 
into #temp 
from 
rest of pivot query 

, а затем группировка всего

select 
case when grouping(agegroup)=1 then 'total' else agegroup end agegroup, 
sum(male) as male, 
sum(female) as 'female', 
sum(trans) as 'trans', 
sum(unknown) as 'unknown', 
sum(total) as 'Total' 
from #temp 
group by 
grouping sets 
(
(agegroup), 
() 
) 
+0

Спасибо. Дает эту ошибку: Msg 8158, уровень 16, состояние 1, строка 135 «val» имеет больше столбцов, чем указано в списке столбцов. – Philip

+0

The Val должен быть как this.values ​​(мужчина), (женщина) .. Я обновлю, как только я рядом с компьютером. Вероятно, в ближайшие 1 час – TheGameiswar

+0

Спасибо @TheGameiswar – Philip

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