2017-02-14 37 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

谢谢。尽管给出了这个错误:消息8158,级别16,状态1,行135 “val”的列数多于列列表中指定的列数。 – Philip

+0

Val应该是这样的.values(男),(女)..我会更新一次我接近一台电脑。可能在接下来的1小时 – TheGameiswar

+0

谢谢@TheGameiswar – Philip